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。但是,我的可達性控制器確實通知用戶當前的網絡可用性,所以在某些時候我將不得不再次使用主隊列。
我堅信必須有更好的辦法。
Nsthread可能是preety但ID敦促你堅持以gcd使用dispatch或nsoperarionqueues –
@Ismael:我同意一個更清潔的方法,但我的問題是別的。如果由於某種原因數據被接收爲零或空,則從服務器檢索數據;觸發可達性測試,因爲數據收到主隊列上,「我可以在塊內引入另一個後臺隊列請求,僅用於可達性測試嗎?」 PS我將我的代碼從NSThread移植到GCD,這就是爲什麼https://developer.apple.com/library/mac/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/ThreadMigration/ThreadMigration.html#//apple_ref/doc/ uid/TP40008091-CH105-SW1 –
答案是肯定的,你可以。調度只是將該執行引發到另一個線程中。但是,您正在輸入主線程,然後您將返回到後臺線程。如果你的數據是零/空,你可以跳過進入主線程。 – Ismael