Приложение залипает на 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%.