2010-09-01 49 views
2

这是我的第一个问题,请原谅我是否犯了错误!在后台调用代理的方法

在我的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]; 
} 

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

我该如何实现以异步方式执行的方法通知代理的任何更改?

回答

4

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

documentation for details

这将同步在主线程上执行操作。只要没有什么在主线程中试图执行那个辅助线程中的东西,这样做大多是安全的。

但是如果你不想阻塞计算直到主线程为请求提供服务,你可以通过NO来不等待。如果你这样做,那么你也必须担心线程同步。主线程可能不会立即为请求提供服务,并且当它发生这种情况时,后台线程可能正处于变化状态的过程中。

线程很难。

+0

的确,他们是。 ;)几分钟前,我发现了performSelectorOnMainThread方法。 我最后在background-thread-class中添加了另一个方法,它由“performSelectorOnMainThread”调用。所以这个方法在主线程上调用委托的方法,一切正常。谢谢! – 2010-09-01 15:36:07