2013-01-15 36 views
0

這就是我正在做的。如何將操作從主隊列轉移到後臺釋放主隊列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); 

dispatch_async(queue, ^{ 
    NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://myurl"]]]; 
    dispatch_sync(dispatch_get_main_queue(), ^{ 
     if(!data) { 
      // data not recieved or bad data. Initiate reachability test 
      // I have built a wrapper for Reachability class called ReachabilityController 
      // ReachabilityController also notifies the user for avaibility, UI 

      ReachabilityController *reachability = [[ReachabilityController alloc] init]; 
      [reachability checkReachability]; 
      return; 
     } 
     //update table 
    }); 
}); 

我的問題是可達性測試在主隊列中,這往往凍結UI正在做。我想在後臺模式下運行。

我想在後臺模式或低優先級模式下處理ReachabilityTest。但是,我的可達性控制器確實通知用戶當前的網絡可用性,所以在某些時候我將不得不再次使用主隊列。

我堅信必須有更好的辦法。

回答

1

然而,這是一個正確的方法。它看起來不太漂亮,但這並不意味着它是不正確的。如果你想要你的代碼看起來更「乾淨」,你可能想看看NSThread並按照你的方式工作,但這是一個更容易的方法。

,使之在我的項目看起來更簡單,我們做的是使用塊一個簡單的類叫做調度員:

+ (void)dispatchOnBackgroundAsync:(void(^)(void))block { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), block); 
} 

+ (void)dispatchOnMainAsync:(void(^)(void))block { 
    dispatch_async(dispatch_get_main_queue(), block); 
} 

像這樣使用:

[Dispatcher dispatchOnBackgroundAsync:^{ 
    // background thread code 

    [Dispatcher dispatchOnMainAsync:^{ 
     // main thread code 
    }]; 
}]; 
+1

Nsthread可能是preety但ID敦促你堅持以gcd使用dispatch或nsoperarionqueues –

+0

@Ismael:我同意一個更清潔的方法,但我的問題是別的。如果由於某種原因數據被接收爲零或空,則從服務器檢索數據;觸發可達性測試,因爲數據收到主隊列上,「我可以在塊內引入另一個後臺隊列請求,僅用於可達性測試嗎?」 PS我將我的代碼從NSThread移植到GCD,這就是爲什麼https://developer.apple.com/library/mac/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/ThreadMigration/ThreadMigration.html#//apple_ref/doc/ uid/TP40008091-CH105-SW1 –

+1

答案是肯定的,你可以。調度只是將該執行引發到另一個線程中。但是,您正在輸入主線程,然後您將返回到後臺線程。如果你的數據是零/空,你可以跳過進入主線程。 – Ismael