Jaa*_*nus 1 iphone concurrency cocoa cocoa-touch nsoperation
考虑一下:
@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
Run Code Online (Sandbox Code Playgroud)
用英语讲:
我有一个视图控制器在主线程中运行一个子模型对象来做某事(通过网络获取数据).视图控制器是子项的委托,因此子项可以通过委托发回结果.为了执行昂贵的工作,我使用NSInvocationOperation生成child.doSomething方法,该方法在后台线程中启动操作.完成后,子进程调用委托的(视图控制器)callbackA或callbackB并带有一些结果.因为(我认为)这些回调是在运行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.
}
}
Run Code Online (Sandbox Code Playgroud)
问题:
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.
}
Run Code Online (Sandbox Code Playgroud)
这让我摆脱了整个函数的长度else,使代码更清晰.你可以用这种方式保存一个缩进级别;-)
| 归档时间: |
|
| 查看次数: |
1168 次 |
| 最近记录: |