UIActivityViewController занимает много времени, чтобы представить
Я сделал приложение для iPhone. Теперь я воссоздаю его для iPad.
Когда пользователь выбирает кнопку действия на панели инструментов, popover должен показывать с UIActivityViewController
, но по какой-то причине он занимает около 10 секунд, чтобы он отображался в первый раз. На iPhone это занимает около секунды. Это тот же код, кроме popover.
Я попытался отключить popover, но для отображения все равно требуется около 10 секунд.
Вот код:
-(IBAction)Actions:(UIBarButtonItem*)sender
{
if ([activityPopover isPopoverVisible] == YES)
{
[activityPopover dismissPopoverAnimated:YES];
return;
}
UIWebView *currentWebView = ((TabView *)self.tabs[self.currentTabIndex]).webViewObject;
NSString *currentURL = (NSString*)[currentWebView request].mainDocumentURL;
if (currentURL == NULL) return;
BookmarkActivity *bookmarkActivity = [[BookmarkActivity alloc] init];
UIActivityViewController *sharing = [[UIActivityViewController alloc] initWithActivityItems:[NSArray arrayWithObject:currentURL] applicationActivities:@[bookmarkActivity]];
activityPopover = [[UIPopoverController alloc] initWithContentViewController:sharing];
[activityPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}
Я протестировал на своем iPad 3 и моем iPad mini, оба уделили немного времени, чтобы представить это.
Как я могу решить проблему?
Ответы
Ответ 1
Хороший вопрос, у меня была такая же проблема. Это не разрешимо. Однако вы можете улучшить работу пользователя, создав индикатор активности, а затем отправив инициализацию UIActivityViewController в фоновом режиме:
-(void)openIn:(id)sender
{
// start activity indicator
[self.activityIndicator startAnimating];
// create new dispatch queue in background
dispatch_queue_t queue = dispatch_queue_create("openActivityIndicatorQueue", NULL);
// send initialization of UIActivityViewController in background
dispatch_async(queue, ^{
NSArray *dataToShare = @[@"MyData"];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:dataToShare applicationActivities:nil];
// when UIActivityViewController is finally initialized,
// hide indicator and present it on main thread
dispatch_async(dispatch_get_main_queue(), ^{
[self.activityIndicator stopAnimating];
[self presentViewController:activityViewController animated:YES completion:nil];
});
});
}
Это работает как шарм. Когда пользователь прикасается к кнопке, индикатор активности начинает анимацию, что указывает на то, что процесс займет некоторое время.
Ответ 2
У меня была такая же проблема на iOS 7. Однако, когда я удалил UIActivityTypeAirDrop
из разрешенных видов деятельности, контроллер появляется почти мгновенно.
Ответ 3
Хотя эти вызовы уже из основного потока, так как iOS 7, перенос некоторых из этих вызовов представления в блок отправки, кажется, значительно уменьшает задержку
dispatch_async(dispatch_get_main_queue(), ^{
[self presentViewController:activityViewController animated:YES completion:nil];
});