2012-10-12 11 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

当然,我打算展示结构而不是提供代码来复制和粘贴... –