UIActivityViewController занимает много времени, чтобы представить - программирование

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, оба уделили немного времени, чтобы представить это.

Как я могу решить проблему?

4b9b3361

Ответ 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];
});