在后台调用委托方法

时间:2010-09-01 15:17:06

标签: iphone delegates nsthread

这是我的第一个问题,如果我犯了任何错误,请原谅!

在我的iPhone项目中,我有一个在线程中运行的方法需要很长时间才能执行(这就是它在线程中运行的原因)。

[NSThread detachNewThreadSelector:@selector(methodToBeCalledInAThread) toTarget:self withObject:nil];

// ...

-(void)methodToBeCalledInAThread {  
    MyClass *myClass = [[MyClass alloc] init];  
    [myClass setDelegate:self]; 
    [myClass veryIntensiveComputing];   
    [myClass release];
}

我的目标是通知ViewController在此方法中调用此方法进行任何进展。这就是我将ViewController设置为类的委托的原因。

现在用昂贵的方法我做了以下几点:

if(self.delegate != nil) {
    [self.delegate madeSomeProgress];
}

但不幸的是,这不起作用,因为(我认为)我在后台线程中。

如何通过异步执行的方法通知代理任何更改?

1 个答案:

答案 0 :(得分:4)

尝试[self.delegate performSelectorOnMainThread: @selector(madeSomeProgress) withObject: nil waitUntilDone: YES]; ....

请参阅documentation for details

这将同步在主线程上执行操作。只要主线程中的 nothing 尝试在该辅助线程中执行东西,这几乎是安全的。

然而如果您不想在主线程为请求提供服务之前阻止计算,则可以将NO传递给不等待。如果这样做,那么您还必须担心线程同步。主线程可能不会立即为请求提供服务,当它执行时,您的后台线程可能正在变异状态。

线程很难。