我有一個應用程序使用連接隊列來處理後臺線程上的連接。每個連接發送一個JSON帖子,然後當它收到成功時,將一些對象保存到coredata中。主隊列上的dispatch_async塊永遠不會被執行
一旦所有連接完成,我在主線程上調用dispatch_async
來調用finished
方法。但是,在非常特定的數據發送/保存條件下,我注意到主線程的dispatch_async
塊永遠不會被調用,並且應用程序屏幕凍結,所有執行停止,並且應用程序處於閒置狀態屏幕。根據xcode的處理能力爲0%。
這裏是失敗塊的方法。
- (void)connectionDidComplete
{
_completeConnections++;
_syncProgress = (float)_completeConnections/(float)_totalConnections;
dispatch_async(mainQueue, ^(void) {
[[NSNotificationCenter defaultCenter] postNotificationName:SyncQueueDidUpdateNotification object:nil];
}); <-- this dispatch works
if (_completeConnections == _totalConnections)
{
// clear unsynced data
NSArray *syncedObjects = [SyncObject completedSyncObjects];
if (syncedObjects.count > 0)
{
for (SyncObject *syncObject in syncedObjects)
{
[syncObject delete];
}
}
//this method saves the current context, then merges this context with the main context right after
[[VS_CoreDataManager sharedManager] saveManagedObjectContextAndWait:managedObjectContext];
// cleanup the thread's context
[[VS_CoreDataManager sharedManager] unRegisterManagedObjectContextForThread:currentThread];
managedObjectContext = nil;
// complete sync
dispatch_async(mainQueue, ^(void) {
[self performSelector:@selector(finishSync) withObject:nil afterDelay:2];
}); <-- this dispatch never gets called
}
}
我懷疑這個問題與保存上下文然後合併它有關。並且可能在合併過程中發佈它,造成一些奇怪的掛斷,並且調度沒有得到執行。這只是一個猜測,但我不知道如何解決它。
任何想法?
謝謝。
不知道爲什麼該塊沒有執行(你有沒有在塊內設置斷點或添加調試日誌消息?),而不是你的'dispatch_async' +'performSelector:withObject:afterDelay:',爲什麼不使用['dispatch_after'](https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/ man3/dispatch_after.3.html)而不是? – DarkDust
+1是否在塊內部獲得。不知道「completedconnections」是否等於「totalconnections」。 – Putz1103
ive在塊中設置斷點,執行沒有達到它 – JMD