2011-05-25 53 views
0

我正在執行一個線程,該線程一直在尋找網站的更新。應該可以在某些視圖中設置刷新率。使用GCD在塊內分配值

更新線程不斷檢查更新的時間間隔。但我想避免比賽條件。 (我連跟GCD擔心這個?)

//This variable is used to avoid race conditions, refreshRate is a instance variable 
int threadRefreshRate = refreshRate; 
BOOL autoRefresh = YES; 


dispatch_async(autoUpdateQueue,^{ 
    while(YES){ 
     NSLog(@"Runs autoupdate thread"); 
     dispatch_async(dispatch_get_main_queue(), ^{ 

      if(autoRefresh){ 
       [self checkForUpdate]; 
       //Trying to set thread variable to avoid race condition 
       threadRefreshRate = refreshRate; 
      } 
      else 
       NSLog(@"Should not auto refresh"); 
     }); 
     sleep(threadRefreshRate); 
    } 

}); 

我試圖執行這些代碼。然而,它不能用於在塊中分配「線程」變量。

回答

2

對於您給出的代碼種類,我會使用隊列中引發的計時器事件,而不是在代碼中進行明確的休眠。你不這樣擔心比賽條件等。

queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0); 
self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); 
if (!timer) return; 
dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), refreshRate * NSEC_PER_SEC, 5 * NSEC_PER_SEC); 
dispatch_source_t timer = self.timer; 
//initialize self to blockSelf with __block 
self.timerAction = ^{ 
[blockSelf checkForUpdate]; 
}; 

dispatch_source_set_event_handler(timer, timerAction); 
dispatch_resume(timer); 

當自動刷新設置爲NO,您可以通過

dispatch_source_cancel(timer); 
+0

取消它,所以我沒有在運行一個循環?我需要使用全局隊列嗎? – johan 2011-05-25 10:20:57

+0

@Johan是的,你不必循環運行。我認爲計時器事件也可以在其他隊列中提出。 – 2011-05-25 13:34:47