2012-10-12 12 views
3

我有這樣的方法:iOS:如何在後臺線程中使用數據來努力工作?

- (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; 
} 

如何實現的?

+1

如果你想在後臺處理某些東西,你不能像這樣返回結果。你將不得不使用委託或塊(如匿名函數)。 –

+2

你說你想讓主線程在這個新線程上等待。如果這樣做,製作線程就沒有意義了。就像你在這裏使用的方法。 –

+0

這是因爲我想開始activityIndi​​cator,然後做一些辛苦的工作。如果要在主線程上努力工作,活動指標不希望可見 – Jim

回答

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 
} 
+0

如何返回結果? – Jim

+0

不,我沒有使用ARC – Jim

+3

如果您希望主線程在此線程上等待,請勿使用線程 –

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 
     }); 

    }); 
1

Commonadvice是利用現有的抽象的最高水平,你執行任務。因此,NSThread應該在後臺執行工作的列表中相對較低。

您調查的API的順序應該是這樣的:

  1. NSOperation/NSOperationQueue
  2. Grand Central Dispatch(libdispatch)
  3. NSThread
  4. POSIX線程

與前兩個你把你的代碼寫成一個「工作單元」,然後把這個工作o一個隊列在某個點執行。系統負責爲您創建和銷燬線程,並且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]; 

那樣容易。

1

這通常不會如何做到。您需要更像這樣的結構:

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

也就是說,您將請求和事後處理保存在一個地方。

+1

這是很好的,直到你通過NULL完成塊。遵循平臺命名約定可以使你的代碼更好,例如' - (void)doSomeWorkWithCompletionHandler:(void(^)(void))completion;' – jackslash

+0

當然,我打算展示結構而不是提供代碼來複制和粘貼... –