0

何か気になったので投稿します。たとえば、次のサンプル コードを見てみましょう (例として)。

    -(void)doSomething{
         for (int i=0;i<10000000000;i++){
             nslog(@"%i", int);
         }
         nslog(@"i'm done!");
    }

for loop同じメソッド ( ) で実行する方法はありますが、 ( )doSomethingのようなことをする必要なく別のスレッドで実行できますか? また、NSLog は、終了後にのみ実行する必要があります。 そこに何かがある場合は、サンプルコードをいただければ幸いです! ありがとうございました。NSOperationQueue@selector
for loop

4

3 に答える 3

1

はい、GCD を で使用できますdispatch_async。ただし、i'm doneすべての反復が完了した後、NSLog は実行されません。バックグラウンド (反復) スレッドが完了するまでプライマリ (メイン) スレッドで待機する必要があるため、意味がありません。

UI のメイン スレッドをブロックしたくない場合は、メソッド全体をバックグラウンド スレッドで実行する必要があります。

于 2012-05-30T22:54:03.933 に答える
0

あなたが書いているコードの性質は何ですか?for高価なループを高速化したいですか? ループが完了するまで包含メソッドをブロックしたいですか、それともNSLog()ループが終了した後に単に実行したいですか? 詳細を知らなくても、いくつかのオプションがあります。

- (void)doSomething
{
  dispatch_apply(10000000000, dispatch_get_global_queue(), ^(size_t i) {
    NSLog(@"%d", i);
  });

  NSLog(@"I'm done!");
}

または

- (void)doSomething
{
  dispatch_queue_t calling_queue = dispatch_get_current_queue();
  dispatch_async(dispatch_get_global_queue(), ^{
    for (int i = 0; i < 10000000000; i++)
    {
      NSLog(@"%d", i);
    }

    dispatch_async(calling_queue, ^{
      NSLog(@"I'm done!");
    });
  });
}
于 2012-05-30T23:18:30.143 に答える