Остановить вычисление Core Data?

#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.