У меня есть приложение, которое использует очередь подключения, которая обрабатывает соединения в фоновом потоке. Каждое соединение отправляет сообщение JSON, а затем, когда оно получает успех, сохраняет некоторые объекты в coredata.
Как только все соединения завершены, я вызываю 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 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
}
}
Мое подозрение в том, что эта проблема имеет какое-то отношение к сохранению контекста, а затем к его объединению. И, возможно, в то время как это происходит, его выпущенный в середине слияния, в результате чего некоторые странные зависают, и отправка не выполняется. Однако это только предположение, и я не знаю, как это исправить.
Любые идеи?
Спасибо.