Cocoa 是否保留对NSThread的引用并向其对象发送消息?
我有点不确定如何做到这一点: 我启动一个“工作线程”,在我的应用程序“生命”期间运行 然后 现在,线程每5秒“唤醒”(initWithTimerInterval)一次,查看是否 它可以完成任何任务。BackGroundUpdate类中的所有任务目前仅与时间相关。我想有一些是“事件相关的”。e、 我想从我的主线程调用背景对象,并告诉它“加速”、“减速”、“重置”或对象上的任何方法Cocoa 是否保留对NSThread的引用并向其对象发送消息?,cocoa,nsthread,Cocoa,Nsthread,我有点不确定如何做到这一点: 我启动一个“工作线程”,在我的应用程序“生命”期间运行 然后 现在,线程每5秒“唤醒”(initWithTimerInterval)一次,查看是否 它可以完成任何任务。BackGroundUpdate类中的所有任务目前仅与时间相关。我想有一些是“事件相关的”。e、 我想从我的主线程调用背景对象,并告诉它“加速”、“减速”、“重置”或对象上的任何方法 要做到这一点,我想我需要类似于performSelectorOnThread的东西,但是如何获取对NSthread和后
要做到这一点,我想我需要类似于
performSelectorOnThread
的东西,但是如何获取对NSthread和后台对象的引用?直接回答:使用[[NSthread-detachNewThreadSelector:toTarget:withObject:]而不是+[NSthread-detachNewThreadSelector:toTarget:withObject:]。别忘了打电话启动
其他想法:
- 考虑改用NSOperation/NSOperationQueue。对于大多数辅助线程使用来说更简单、更高效
- 考虑您是否真的需要在后台线程上执行定期检查。您是否可以在主运行循环上执行此操作,然后根据需要将工作转移到其他线程上?线程不是免费的
- 考虑轮询是否也是最好的实现。查看NSCondition和/或NSConditionLock,以获得更有效的方法,在发生不需要轮询的情况下(例如向队列添加工作)唤醒线程
[NSThread detachNewThreadSelector:@selector(updateModel) toTarget:self withObject:nil];
- (void) updateModel {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BackgroundUpdate *update = [[BackgroundUpdate alloc] initWithTimerInterval:5];
[[NSRunLoop currentRunLoop] run]; //keeps it going 'forever'
[update release];
[pool release];
}