UIActivityViewController の表示に時間がかかります 質問する

UIActivityViewController の表示に時間がかかります 質問する

iPhone用のアプリを作りました。今はiPad用に作り直しています。

ユーザーがツールバーのアクション ボタンを選択すると、ポップオーバーが表示されますがUIActivityViewController、何らかの理由で、最初に表示されるまでに約 10 秒かかります。iPhone では、約 1 秒かかります。ポップオーバーを除いて、コードは同じです。

ポップオーバーを無効にしてみましたが、それでも表示されるまでに約 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];
        });
    });
}

これはうまく機能します。ユーザーがボタンをタッチすると、アクティビティ インジケーターがアニメーションを開始し、プロセスに時間がかかることを示します。

おすすめ記事