Приложение залипает на OSSpinLockLockSlow

Обновление 2: Я нашел обходной путь, который должен синхронизировать освобождение MOC и сохранение. Пожалуйста, смотрите обновленный проект.https://github.com/shuningzhou/MOCDeadLock.git

Примечание: я сделал это более агрессивно. Не запускайте его на реальном устройстве!

Обновить: Пример проекта для демонстрации этой проблемы.https://github.com/shuningzhou/MOCDeadLock.git

XCode 6.2: Невозможно воспроизвести.

XCode 6.3: Воспроизводимый.

Бета-версия XCode 6.4: Воспроизводимая.

==========================Проблема ===============================

Наше приложение случайно застряло наOSSpinLockLockSlow после обновления до XCode 6.3. В нашем проекте мы использовалиNSOperation а такжеNSOperationQueue чтобы получить данные с нашего сервера и использовать основные данные для сохранения данных.

Эта проблема никогда не случалась раньше! По трассировке стека видно, что наш код не вызывает никаких вызовов. Я не уверен, где начать отладку этого. Может ли кто-нибудь дать какое-нибудь руководство?

Заранее спасибо!

Пожалуйста, смотрите трассировку стека

Редактировать:

Мы используемAFNetworking и нашNSOperations подклассыAFHTTPRequestOperation, Мы добавили некоторые пользовательские свойства и переопределили метод-(void)start:

- (void)start;
{
    //unrelated code...

    NSString *completionQueueID = [NSString uuid];
    const char *cString = [completionQueueID cStringUsingEncoding:NSASCIIStringEncoding];
    self.completionQueue = dispatch_queue_create(cString, DISPATCH_QUEUE_SERIAL);

    //unrelated code....

    [super start];
}

ЗаCore DataМы следим заthread-confinement шаблон. У нас есть отдельныйmanaged object context для каждого потока, и контексты разделяют статическийpersistent store coordinator.

Изменить 2:

Дополнительная информация: Я обнаружил, что эта проблема возникает, когда система выходит из нескольких потоков одновременно. Мы сохраняем контекст управляемого объекта в словаре потоков, и они освобождаются при выходе из потоков.

[[[NSThread currentThread] threadDictionary] setObject:dataManager forKey:@"IHDataManager"];

Загрузка процессора составляет около 20%.

Ответы на вопрос(1)

Ваш ответ на вопрос