Blok dispatch_async w głównej kolejce nigdy nie jest wygładzony
Mam aplikację, która używa kolejki połączeń, która obsługuje połączenia na wątku w tle. Każde połączenie wysyła post JSON, a następnie po otrzymaniu sukcesu zapisuje niektóre obiekty w coredata.
Gdy wszystkie połączenia zostaną zakończone, dzwonię pod numerdispatch_async
w głównym wątku, aby zadzwonićfinished
metoda.
Jednak w bardzo specyficznych warunkach wysyłania / zapisywania danych zauważyłemdispatch_async
blok do głównego wątku nigdy nie zostanie wywołany, a ekran aplikacji zawiesza się, wszystkie wykonania zostają zatrzymane, a aplikacja pozostaje bezczynna z zamrożonym ekranem. moc przetwarzania według xcode wynosi 0%.
Oto metoda z błędnym blokiem.
- (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
}
}
Podejrzewam, że ten problem ma coś wspólnego z zapisaniem kontekstu, a następnie połączeniem go. I być może, kiedy to się dzieje, zostanie wydane w środku scalania, powodując dziwne rozłączenie się, a wysyłka nie zostanie wykonana. To tylko przypuszczenie i nie wiem, jak to naprawić.
Jakieś pomysły?
Dzięki.