У меня есть приложение, которое использует NSOperations
для управления служебными вызовами в веб-API (вызовы основаны на CURLOperation в сенсорном коде Джона Уайта ).
Есть определенный вызовзагружает местоположения на карте, когда центр представления карты существенно изменяется;поскольку они могут складываться очень быстро, если вы перемещаете карту, я стараюсь агрессивно отменять устаревшие операции.Он отлично работает на 4.0.
Однако на 3.1 кажется, что в некоторых случаях очередь операций будет удерживать отмененные (и освобожденные) операции, вызывая сбой, когда достигнет места, где они должны быть вqueue.
Вот иллюстрация.
Я начинаю с относительно тяжелого вызова службы в очереди:
MyLongRunningOp 0x1
Пользователь переходит на карту.Очередь теперь выглядит следующим образом:
MyLongRunningOp 0x1
MyMapOp 0x2
Они перемещают карту, что отменяет MyMapOp 0x2 и добавляет MyMapOp 0x3:
MyLongRunningOp 0x1
MyMapOp 0x3
MyMapOp 0x2
теперь освобождено, так как оно было удалено из очереди.Теперь MyLongRunningOp 0x1
заканчивается.В обратных вызовах KVO для установки ключа isFinished на MyLongRunningOp
я вижу, что очередь операций обрабатывает уведомление и пытается добавить MyMapOp 0x2
к некоторому NSArray
.Естественно, с включенным NSZombies
,
[MyMapOp retain]: message sent to deallocated instance 0x2
Похоже, что NSOperationQueue
каким-то образом привязан к указателю на отмененную / отпущенную операцию и пытается активировать ее после завершения предыдущей операции.
Мне не удалось воспроизвести это поведение на 4.0, поэтому я считаю, что это ошибка 3.1.
У меня много проблем с этим - насколько я могу судитьЕдинственный обходной путь - никогда не отменять мои операции, что делает работу неоптимальной, когда сеть становится ненадежной.
Кто-нибудь еще испытывал это?Есть идеи?