iphone - 在后台调用委托(delegate)的方法

标签 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 设置为该类的委托(delegate)。

现在,在昂贵的方法中,我执行以下操作:

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

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

如何通过异步执行的方法通知委托(delegate)任何更改?

最佳答案

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

请参阅documentation for details .

这将同步在主线程上执行操作。只要主线程中没有任何东西尝试在辅助线程中执行东西,这基本上是安全的。

但是如果您不想在主线程服务请求之前阻塞计算,则可以传递 NO 来不等待。如果这样做,那么您还必须担心线程同步。主线程可能不会立即为请求提供服务,当它这样做时,您的后台线程可能正处于改变状态的过程中。

线程很难。

关于iphone - 在后台调用委托(delegate)的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3619586/

相关文章:

iphone - 多线程实现的最佳方式

ios - 停止在不同线程上执行的所有动画

iphone - 如何在启动时使用黑色半透明状态栏 - info.plist 键/值似乎不起作用

iphone - 当应用程序从后台重新启动时,我的 AppDelegate.m 中的什么方法被执行?

ios - UITableViewDelegate 方法的确切顺序是什么 - 奇怪的行为

c# - 如何以正确的方式使用委托(delegate)/了解委托(delegate)

ios - iphone AVAudioRecorder,在线程中录制音频

iphone - 如何在 UILabel 中仅突出显示文本 - IOS

ios - 断断续续的分页 UIScrollView 体验

kotlin - Kotlin 内置的 "lazy"函数是如何工作的?