3

私は次のような方法があります:

- (BOOL)shouldDoSomeWork {
   BOOL result = // here I need do hard work with data in background thread and return result, so main thread should wait until the data is calculated and then return result;
   return result;
}

それを実装する方法は?

4

4 に答える 4

5

あなたはこれを探していますか:

-(void) startWork
{ 
    //Show activity indicator
    [NSThread detachNewThreadSelector:@selector(doSomeWork) toTarget:self withObject:nil];
}

-(void) doSomeWork
{
    NSAutoreleasePool *pool = [NSAutoreleasePool new];
    //Do your work here
    [pool release];
    [self performSelectorOnMainThread:@selector(doneWork) withObject:nil waitUntilDone:NO];
}  

-(void) doneWork
{
   //Hide activity indicator  
}
于 2012-10-12T12:19:25.117 に答える
5

GCDでそれを行う方法の例:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // Your hard code here
        // ...

        //BOOL result = ...

        dispatch_async(dispatch_get_main_queue(),^{
            [self callbackWithResult:result];  // Call some method and pass the result back to main thread
        });

    });
于 2012-10-12T12:35:13.937 に答える
1

一般的な アドバイスは、タスクを実行するために利用可能な最高レベルの抽象化を使用することです。そのNSThreadため、バックグラウンドで作業を実行するために実行できることのリストでは、比較的低くする必要があります。

APIを調査する順序は、次のようになります。

  1. NSOperation / NSOperationQueue
  2. グランドセントラルディスパッチ(libdispatch)
  3. NSThread
  4. POSIXスレッド

最初の2つでは、コードを「作業単位」として記述し、この作業をキューに入れて、ある時点で実行します。システムがスレッドの作成と破棄を処理し、APIの操作は簡単です。を使用した例を次に示しNSOperationQueueます。

NSBlockOperation * blockOperation = [NSBlockOperation blockOperationWithBlock:^{
    //Do work


    //update your UI on the main thread.
    [self performSelectorOnMainThread:@selector(workDone:) withObject:workResults waitUntilDone:NO];
}];

[self.operationQueue addOperation:blockOperation];

そのように簡単です。

于 2012-10-12T12:37:59.393 に答える
1

それは通常あなたがそれをする方法ではありません。次のように構造化されたものが必要です。

- (void)doSomeWorkAndThen:(^void)block {
  dispatch_async(dispatch_get_global_queue(0, 0), ^ {
    // do
    // some
    // work
    dispatch_sync(dispatch_get_main_queue(), ^ {
      block();
    });
  }); 

つまり、リクエストとその後の操作を1か所にまとめます。

于 2012-10-12T12:39:11.447 に答える