2010-04-27 59 views
1

我是如何做到這一點有點不確定:保持對NSThread的引用並傳遞其對象?

我啓動我的應用程序「生命」期間運行的「工作者線程」。

[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]; 
} 

現在的線程 「甦醒」 了,每5秒(initWithTimerInterval),看看是否 有它可以做任何任務。目前,BackGroundUpdate類中的所有任務只有時間依賴性。我想有一些「事件依賴」。例如我想從我的主線程中調用背景對象,並告訴它在對象上「加速」,「慢速」,「重置」或任何方法。

要做到這一點,我想我需要類似performSelectorOnThread但如何獲得對NSthread和背景對象的引用?

回答

3

直接回答:不是+ [NSThread detachNewThreadSelector:toTarget:withObject:],而是使用[[NSThread alloc] initWithTarget:selector:object:]。不要忘記打電話 - 開始!

其他的想法:

  • 考慮使用的NSOperation/NSOperationQueue代替。對於大多數工作線程使用更容易和更高效。
  • 考慮你是否真的需要在後臺線程上定期檢查。你可以在主運行循環中執行它,然後根據需要將工作轉移到其他線程上?線程不是免費的。
  • 考慮輪詢是否也是最好的實現。查看NSCondition和/或NSConditionLock,以獲得更有效的方式來在發生某些事情時喚醒線程(如將工作添加到隊列中),而不需要輪詢。
+0

謝謝,bdrister。 最近我結束了很多東西的使用NSOperation,它需要一些習慣,但它真的回報。如此複雜的東西,可以證明它=子類NSoperation,簡單的一次性東西detach或performSelector。 再次感謝。 – RickiG 2010-08-09 12:08:03