NSOperationQueue и NSFetchedResultsController

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

в моем uitableviewcontroller я вызываю каждую X секунду метод в моем основном объекте контроллера.

[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(test:)            userInfo:nil repeats:YES];

}

- (void)test:(NSTimer*)theTimer {

[[MainController instance] updatePersons];

}

В этом методе пользовательский объект NSOperation будет добавлен к моему основному Q.

- (BOOL)updatePersons {

UpdatePersonsOperation* u = [[UpdatePersonsOperation alloc] init];
[u setQueuePriority:NSOperationQueuePriorityVeryHigh];

[operationQ u];

[u release];

Сама операция создает новый контекст управляемого объекта и пытается загрузить некоторый xml из Интернета и пытается обновить базу данных coredata... (Этот код работает!)

В моем основном контроллере я получаю сообщение об изменении контекста и использую mergeChangesFromContextDidSaveNotification для слияния и обновления контекста моего основного объекта. Все контроллеры результатов используют этот основной контекст объекта.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationManagedObjectContextDidSave:) name:
                                        NSManagedObjectContextDidSaveNotification object:nil];

На самом деле все работает, но когда я вставляю новый объект в NSOperation, требуется 4-6 секунд, пока пользовательский интерфейс не обновится и не отобразит этот новый объект... Кроме того, пользовательский интерфейс блокируется... Невозможно прокрутить или вызвать другое взаимодействие. .

Когда я не использую очередь и помещаю свой код для загрузки и обновления объектов в метод внутри моего класса uitableviewcontroller, и я использую это

[NSThread detachNewThreadSelector:@selector(codeFromUpdatePersonsOperation) toTarget:self withObject:nil];

Все работает очень хорошо, без каких-либо задержек или зависаний пользовательского интерфейса...

Может ли кто-нибудь объяснить мне это поведение?

Спасибо


person user547064    schedule 29.05.2011    source источник
comment
После долгих исследований возникла проблема с NSFetchedResultsController! Мой совет: никогда не используйте NSFetchedResultsController при обновлении и загрузке сложных данных из Интернета. Реализуйте собственную логику обновления для uitableview.   -  person user547064    schedule 01.07.2011


Ответы (1)


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

[target performSelectorOnMainThread:@selector(methodToUpdateUI:) withObject:dataFromRetrievalOperation waitUntilDone:NO];

Это приведет к немедленному обновлению пользовательского интерфейса, когда поток завершит обработку. В противном случае он ждет около 5 секунд, прежде чем начнется анимация пользовательского интерфейса.

person Ben L.    schedule 26.05.2012