考虑一下:
@interface SomeViewController : UIViewController {
SomeChildObject *child;
}
@end
@implementation SomeViewController
- (void) viewDidLoad {
...
child.delegate = self;
}
- (void) somethingHappened {
NSInvocationOperation *operation = [[NSInvocationOperation alloc]
initWithTarget:child
selector:@selector(doSomething)
object:nil];
[someNsOperationQueue addOperation:operation];
[operation release];
}
- (void) callbackA:(SomeData *)someData {
[self performSelectorOnMainThread:@selector(callbackAonMainThread:)
withObject:someData
waitUntilDone:NO];
}
- (void) callbackAonMainThread:(SomeData *)someData {
... do something with results in main thread, e.g UI feedback
}
- (void) callbackB:(SomeData *)someData {
[self performSelectorOnMainThread:@selector(callbackBonMainThread:)
withObject:someData
waitUntilDone:NO];
}
- (void) callbackBonMainThread:(SomeData *)someData {
... do something with results in main thread, e.g UI feedback
}
@end
英文:
我有一个在主线程中运行的 View Controller ,其中有一个子模型对象来执行某些操作(通过网络获取数据)。 View Controller 是子级的委托(delegate),因此子级可以通过委托(delegate)发回结果信号。为了执行昂贵的工作,我使用 NSInvocableOperation 生成 child.doSomething 方法,该方法在后台线程中启动该操作。完成后,子进程调用委托(delegate)( View Controller )的回调 A 或回调 B 并返回一些结果。由于(我认为)这些回调是在运行 doSomething 调用的同一后台线程中调用的,因此我需要调用 PerformSelectorOnMainThread 将控制权转移回主线程。
这工作正常,但我不喜欢每个回调都有两个与回调相关的方法。 (实际上有更多的回调,所以真正的代码更加臃肿。)理想情况下,我会做这样的事情:
- (void) callbackA:(SomeData *)someData {
if (not_running_on_main_thread) {
[self performSelectorOnMainThread:@selector(callbackA:)
withObject:someData
waitUntilDone:NO];
} else {
// now running on main thread, work with the results.
}
}
问题:
1) 如何进行“not_running_on_main_thread”测试?
2)还有其他方法可以减少回调的膨胀吗?
编辑:好的,我在发布之前从未阅读过 NSThread 文档:) 看起来 [NSThread isMainThread] 就是我正在寻找的。但是还有其他方法可以重组或使其变得更好吗?
最佳答案
只需检查[NSThread isMainThread]
。如果您需要执行不同操作的多个回调,则您无能为力。
只有一件事我做了不同的事情,我的代码如下所示:
- (void) callbackA:(SomeData *)someData {
if (![NSThread isMainThread]) {
[self performSelectorOnMainThread:@selector(callbackA:)
withObject:someData
waitUntilDone:NO];
return;
}
// now running on main thread, work with the results.
}
这让我摆脱了整个函数的else
并使代码更清晰一些。您可以通过这种方式节省一级缩进;-)
关于iphone - 如何优化 NSOperationQueue 启动线程的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2080141/