2016-06-23 3 views
0

Ok。だから私は、次のビューコントローラへの移行の前にすべての重い読み込みを処理するGCDを使用しようとしています。私は大規模なアーカイブファイルを開いて、時間がかかるそれらを抽出しています。GCDをスレッディングに使用する方が良い方法

全体のプロセスは、このようなものです:

UICollectionViewCell>ディスプレイアクティビティインジケータをクリック> GCDはperformSelectorを使用して重い負荷>コール遷移セレクタの世話をしてみましょう:onThread:.....

問題私がmainThreadを使用すると、トランジションが速すぎるし、すべての負荷が有効になるまでに時間がかかり、トランジションがひどくなり、currentThreadを使用している間に非常に時間がかかります。アプリ。

-(void)someMethod 
{  
    //activity Indicator before transition begins 
    UIActivityIndicatorView *activity=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
    [activity setFrame:self.view.bounds]; 
    [self.view addSubview:activity]; 
    [self.view bringSubviewToFront:activity]; 
    activity.hidesWhenStopped=YES; 
    [activity startAnimating]; 

    dispatch_queue_t transitionQueue; 
    transitionQueue = dispatch_queue_create("com.app.transitionQueue", NULL); 

    dispatch_async(transitionQueue,^{ 
      //heavy lifting code 
     viewerPVC=..... 

     dispatch_async(dispatch_get_main_queue(),^{ 
     [activity stopAnimating]; 
     [self transitionToMangaViewer:mReaderPVC]; 
     }); 
    }; 
} 
-(void)transitionToViewer:(ViewerPVC*)viewerPVC 
{ 
    [self.navigationController pushViewController:mReaderPVC animated:YES]; 
} 

だから最初の提案を試みたが、CollectionViewControllerはまだ何かをしてみてください、あなたはGCDを使用しているときNSThreadを使用する必要があるはずの移行

+0

どのスレッドがロードしても、同じ時間がかかります。これはネットワークのパフォーマンスに依存します。データをプリフェッチできない場合は、ユーザーに良いフィードバックを提供するだけです。私はあなたのバックグラウンドスレッドでUI更新(アクティビティビューの停止など)を実行していることに気付きました。これらのアクションをメインキューにディスパッチする必要があります。あなたはNSThreadで何をしようとしていますか?あなたは一般的にこのクラスを使用しません。 – Paulw11

答えて

2

後もしばらくは背景の上に残っているので、移行はまだバグだらけです代わりにこのように

dispatch_async(transitionQueue,^{ 
    //heavy lifting code 
viewerPVC=..... //this should block here otherwise will not work 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [activity stopAnimating]; 
     [self transitionToAnotherViewer:viewerPVC]; 
    }); 
}); 
+1

あなたは 'dispatch_async(dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_BACKGROUND、NULL)、^ {')を使うことができます。 – Fonix

1

UIアップデートはメインスレッドで行う必要があります。UIトランジションを実行するための新しいスレッドを作成する必要はありません。以下のコードを試してください:

dispatch_async(transitionQueue,^{ 
     //heavy lifting code 
     viewerPVC=..... 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      [activity stopAnimating]; 

      [self performSelector:@selector(transitionToAnotherViewer:) withObject:viewerPVC waitUntilDone:YES]; 
     }); 

    }; 
関連する問題