2014-02-19 78 views
2

在我的iPhone應用程序中,我使用了dispatch_async塊沒有問題。該應用程序檢查價格更新網站,解析HTML,相應地更新核心數據模型,然後刷新正在查看的表。iPhone應用程序與dispatch_async崩潰如果操作未完成

但是,在我最新的應用程序中,我發現我可以通過在價格更新過程運行時切換出應用程序來使應用程序崩潰。第一次和第二次使用之間的差異似乎只是我從表refreshController(即tableViewController現在內置的「拉到再刷新」機制)調用調度塊,而現在是iOS7。

任何人都可以向我推薦dispatch_async應該如何在已知條件下正常中止,例如用戶希望停止進程,或者如果他們切換這樣的應用程序,我想攔截該活動以正確管理該塊, 請?

如果有任何有關塊和塊的好的背景知識,我會很高興看到這樣的鏈接 - 謝謝!

這是我使用(大部分樣板)dispatch_async代碼,爲了您的方便:

priceData = [[NSMutableData alloc]init];  // priceData is declared in the header 
priceURL = …  // the price update URL 

NSURL *requestedPriceURL = [[NSURL alloc]initWithString:[@「myPriceURL.com」]]; 
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:requestedPriceURL]; 

dispatch_queue_t dispatchQueue = dispatch_queue_create("net.fudoshindesign.loot.priceUpdateDispatchQueue", NULL); //ie. my made-up queue name 
dispatch_async(dispatchQueue, ^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:urlRequest delegate:self startImmediately:YES]; 
      [conn start]; 
     }) 
}); 

回答

0

沒有明確規定在調度隊列取消。基本上,這將是一個semaphore

NSOperationQueue(更高層次的抽象,但仍然使用底下的GCD)支持取消操作。您可以創建一系列NSOperations並將它們添加到NSOperationQueue,然後在不需要它完成時將消息cancelAllOperations添加到隊列中。

有用的鏈接:

http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/

Dispatch queues: How to tell if they're running and how to stop them

2

那樣板代碼看起來很沒用。

您創建一個串行隊列。您在隊列上派發一個塊,除了在主隊列上分派塊之外什麼也不做。你也可以直接派發到主隊列中。

1

雖然你有一個異步塊,但是你在該塊的主線程上執行NSURLConnection請求,這就是爲什麼如果進程沒有完成,應用程序會崩潰。在後臺線程中執行請求。您在此代碼中阻止主線程。

你可以這樣說:

dispatch_queue_t dispatchQueue = dispatch_queue_create("net.fudoshindesign.loot.priceUpdateDispatchQueue", 0); //ie. your made-up queue name 
dispatch_async(dispatchQueue, ^{ 
     NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:urlRequest delegate:self startImmediately:YES]; 
     [conn start]; 
     ... 
     //other code 
     ... 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      //process completed. update UI or other tasks requiring main thread 
     }); 
    }); 

嘗試閱讀和練習更多的GCD。

Grand Central Dispatch (GCD) Reference from Apple Docs

GCD Tutorial

+0

只知道,是可以安全使用的'self',而不是'的UIViewController __weak weakSelf = self'在'dispatch_async'? –

+0

是的,在異步塊中使用self是安全的..但是你不能在後臺線程塊中更新UI。 –

+0

好的謝謝。很高興知道 –