Я использую NSOperation для выполнения тяжелого анализа данных, а затем возвращаюсь к основному потоку с объектами, готовыми к использованию моим приложением. Я обрабатываю все операции, помещая их в одноэлементный NSOperationQueue. Я делаю это, чтобы контролировать объем обработки в любой момент, потому что каждая операция временно использует довольно большой объем памяти.
Итак, у меня есть сценарий, в котором на экране может быть несколько контроллеров представления. Каждый контроллер представления будет создавать операцию синтаксического анализа при загрузке и добавлять ее в очередь. Я разрешаю 2 одновременные операции обработки, установив maxConcurrentOperationCount. Каждый контроллер представления создает операцию обработки, помещает ее в одноэлементную очередь и сохраняет операцию как свойство, поэтому имеет дескриптор для нее.
Если контроллер представления должен уйти в ответ на действие Delete, инициированное пользователем, я использую свойство NSOperation в методе dealloc моего контроллера представления, чтобы отменить операцию:
-(void)dealloc{
[self.currentOperation cancel];
[super dealloc];
}
В моем подклассе NSOperation я проверяю свойство isCancelled в нескольких местах (в основном перед значительными фрагментами длительной работы) свойство isCancelled и пытаюсь ответить на него:
if([self isCancelled]){
// Perform cleanup
return;
}
Проблема в том, что свойство isCancelled оценивается как false, и операция продолжается, в конечном итоге вызывая Core Data, чтобы попытаться получить данные, которые были удалены. Я вижу, что это происходит, даже когда я размещаю проверку isCancelled непосредственно перед запросом на выборку Core Data.
У меня есть обходной путь, чтобы предотвратить сбой приложения, но я думаю, что могу ошибиться в реализации. Есть ли другой способ сохранить дескриптор операции во время ее обработки, чтобы при необходимости отменить ее? Мой метод не сохраняет надлежащий дескриптор операции и не препятствует ее правильной отмене?