#ios #core-data
#iOS #core-data
Вопрос:
У меня длительный расчет с Core Data
:
let contextTemporary = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
contextTemporary.parent = context
contextTemporary.perform {
//long running calculation
}
Это способ убить его, сломать, остановить?
Комментарии:
1. Я думаю, что «abort();» используется для разрыва цикла в блоке завершения. Может быть, вы можете проверить условие в блоке, и в этом случае вы хотите остановить эту операцию. И для возврата предыдущего состояния контекста, возможно, вы можете использовать «откат»
Ответ №1:
Это зависит от того, что вы делаете в этом блоке. Нет способа сказать, прекратите выполнение того perform
блока, который я запустил. Однако,
- Вы можете заставить код в этом блоке время от времени проверять внешний флаг (например, логическое значение с именем
cancel
maybe) и останавливать выполнение, если его значение изменяется. - Если ваш блок выполняет что-то вроде длительной выборки, рассмотрите возможность использования
NSAsynchronousFetchRequest
, которое может быть отменено.
Комментарии:
1. Насколько опасен флаг доступа из разных потоков? Т.е. запись только из одного потока, но чтение из многих разных? Я пока не сталкивался ни с какой проблемой, но условия Bernstein этого не допускают.
2. Если вас это беспокоит, вы всегда можете использовать GCD, чтобы убедиться, что вы проверяете этот флаг в том же потоке, где вы меняете его значение. Посмотрите
Dispatch
на Swift илиdispatch_async
на Objective-C.