2010-12-13 30 views
0

我必須執行一個使用NSThread的計時器,因爲我需要從網絡下載文本數據,如果沒有這一點,在3G連接下載時會凍結UI。所以我用了一個NSThread,但它仍然凍結了一段時間,我不知道如何解決這個....即使使用nsthread接口凍結

這裏是我用來執行定時器代碼:

- (void)viewDidLoad{ 
    [NSThread detachNewThreadSelector:@selector(onTimerK2) toTarget:self withObject:nil]; 
} 

- (void)onTimerK2{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
timer = [NSTimer scheduledTimerWithTimeInterval:15 target:self selector:@selector(onTimerKY2) userInfo:nil repeats:YES]; 
[pool release]; 
} 

- (void)onTimerKY2{ 
    NSLog(@"working"); 
} 

回答

1

你正在分離一個新的線程來呼叫onTimerK2,然後立即在主線程上調用一個方法,這當然會凍結你的界面。

編輯

你應該做任何長期運行的工作不是在主線程(無論是你自己,或者使用的NSURLConnection異步特性如其他地方提到),然後通過調用選擇更新UI在這個活動進展的主線程上。

說了這麼多,你可以有你的代碼的以下更改/重新排序更多的成功:

- (void)viewDidLoad { 
    timer = [NSTimer scheduledTimerWithTimeInterval:15 
              target:self 
              selector:@selector(onTimerK2) 
              userInfo:nil 
              repeats:YES]; 
} 

- (void)onTimerK2{ 
    [NSThread detachNewThreadSelector:@selector(onTimerKY2) 
          toTarget:self 
          withObject:nil]; 
} 

- (void)onTimerKY2{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSLog(@"working"); 
    [pool release]; 
} 
+0

好的,你是,所以我修改了代碼,但是然後定時器不再工作。請參閱第一篇文章,並感謝您的回答 – 2010-12-13 16:01:15

+1

如果您想從輔助線程啓動計時器,則需要配置運行循環。 – taskinoor 2010-12-13 16:11:50

+0

實際上它不會在主線程中調用方法。計時器將被安排在新線程的運行循環中 - 該服務沒有被服務,所以定時器不會被觸發。 – JeremyP 2010-12-13 16:42:01

0

這不是很清楚你是如何試圖通過使用定時器來解決UI凍結問題。但是如果你的用戶界面由於下載而被凍結,那麼你可以嘗試asynchronous loading而不是使用定時器或分離另一個線程。

編輯:除非您爲輔助線程配置運行循環,否則計時器不會從該線程工作。檢查線程編程指南中的run loop management。與使用異步連接相比,這可能是一項艱鉅的任務。

+0

我使用了一個計時器,因爲每15秒鐘我必須從在線文本中下載數據,我在那裏抓取一些文本 – 2010-12-13 16:03:04

+0

這並不妨礙你加載異步。 – taskinoor 2010-12-13 16:05:12