14

iPhone用アプリを作った。今、私はiPadのためにそれを再作成しています。UIActivityViewControllerプレゼントに長時間を要する

ユーザーがツールバーのアクションボタンを選択すると、ポップオーバーにはUIActivityViewControllerが表示されますが、何らかの理由で最初に表示されるのに約10秒かかります。 iPhoneでは約1秒かかります。それは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のミニでテストされています。

どうすれば問題を解決できますか?

+0

を減らすように見えるあなたは、時間プロファイラでそれをテストしたことがありますか?あなたはほとんどの時間を取る指示が何かを発見するかもしれません。 –

+0

いいえ、どうすればいいですか? – Maximilian

+0

cmd + Iを押してから、profilerを選択します.10-20秒間待機します。次に、「システムライブラリを非表示にする」オプションを選択します。これにより、コールスタックでメソッドを確認できます。その上で2回、時間の消費が表示されます。 –

答えて

18

良い質問ですが、私はちょうど同じ問題を抱えていました。それは本当に解決できません。しかし、あなたは活動の指標を作成し、その背景に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

私は同じ、しかしよりエレガントな方法でお勧めします。 'UIBarButtonItem'プロパティ' customView'をオンザフライで作成された 'UIActivityIndi​​cator'に設定します。これにより、ボタンのアイコンがアクティビティインジケータに置き換えられます。次に、プレゼンテーションアニメーション呼び出しの完了ブロックで、[[button setCustomView:nil] ']をクリックすると、元のスタイルに戻ります。 =) –

+0

@BrunoPhilipe iOS 7.0.3システムアイコンで作成されたUIBarButtonItemで 'setCustomView:nil'を呼び出すと、アイコンが完全に削除されます。 – zekel

+0

@zeckel私はiOS 7.1ベータ版のアプリでやっていて、正しく動作します。多分それは別のものでしょうか?あなたのボタンが置換を行う前にカスタムビューを使用していた場合は、代わりに 'nil'に設定する代わりに元のビューに戻す必要があります。 'customView'の前の値を調べてみてください。 –

13

私はiOS 7でも同じ問題が発生していましたが、許可されたアクティビティタイプからUIActivityTypeAirDropを削除すると、コントローラがすぐに表示されます。

+0

それはAppleがそれを速くすることができない奇妙な、そして悲しい:Oありがとう! – Maximilian

+5

これは以前より高速ですが、まだ遅いです – Gabox

+3

対応するコード:UIActivityViewController * activityController = [[UIActivityViewController alloc] initWithActivityItems:sharingItems applicationActivities:nil]; activityController.excludedActivityTypes = @ [UIActivityTypeAirDrop]; – Beninho85

5

これらの呼び出しはメインスレッドからすでにですが、iOSの7以来、ディスパッチブロックにおけるそれらのプレゼンテーションのコールの一部をラップすることは大幅に遅れ

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self presentViewController:activityViewController animated:YES completion:nil]; 
}); 
+0

これを測定しましたか?これは、mainloopの次の反復でプレゼンテーションを実行するだけで、実際にはそれを直接呼び出したときと比べて実際にはより遅く表示されるため、どのように動作するのかほとんど理解できません。 *困惑した* – DrMickeyLauer

関連する問題