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.

questionAnswers(3)

yourAnswerToTheQuestion