2

У меня есть NSURLSession (с делегатом), который загружает некоторые данные. Я не хочу, чтобы метод, инициирующий загрузку (refresh), возвращался до тех пор, пока не будет выполнен метод делегирования. Для этого у меня есть dispatch_semaphore_wait(self.waitSemaphore, timeout) в конце refresh. waitSemaphore получает сигнал в конце соответствующего метода NSURLSessionDownloadDelegate.NSManagedObjectContext performBlockAndWait: и dispatch_semaphore, вызывающий тупик

Внутри этого метода делегата я вызываю другой метод, вызывающий performBlockAndWait (довольно много раз) в NSManagedObjectContext. Этот MOC настроен с помощью NSPrivateQueueConcurrencyType. При первом вызове performBlockAndWait приложение блокируется. В performBlockAndWait я делаю запрос на выборку, без других performBlockAndWaits.

Методы NSURLSessionDownloadDelegate выполняются на основе собственного NSOperationQueue. Я не создаю эту очередь, она создается NSURLSession. Я только сталкиваюсь с вышеупомянутым тупиком, когда я вызываю refresh из основного потока. Если я вызываю его из другой очереди, он работает так, как ожидалось.

Любая помощь с этим была бы высоко оценена.

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

ответ

0

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

Чтобы уклониться от этой проблемы, я создал второй основной стек данных (то есть Can multiple NSPersistentStoreCoordinator instances be connected to the same underlying SQLite persistent store?) в отдельном потоке, чтобы сохранить основной поток для конкретных операций выборки.

Смежные вопросы