2015-11-16 3 views
0

Я следую учебному пособию NSOperation: http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues для загрузки изображений в моем виде. В то время как изображения загружаются, если я поп контроллер представления от моего навигационного контроллера, приложение падает с ошибкой: EXC_BAD_ACCESS на линии:Приложение вылетает, когда я нахожу свой навигационный контроллер, пока NSOperation выполняет performSelectorOnMainThread

[(NSObject *)self.delegate performSelectorOnMainThread:@selector(imageDownloaderDidFinish:) withObject:self waitUntilDone:NO]; 

линия говорит мой делегат (контроллер зрения) для выполнения способа, но я уже вытащил контроллер своего вида. Как я могу предотвратить это? Я попытался отменить свою операционную очередь в viewDidUnload моего контроллера представления, но он не работает. Также попробовали выполнить проверку, если мой делегат равен нулю перед выполнением метода. Любая помощь будет принята с благодарностью.

+0

Если приложение разбилось, сообщайте об ошибке и журнале сбоев. – Rob

ответ

1

Как вы видите свой контроллер?

Для простоты давайте назовем метод, по которому вы наводите свой контроллер вида pop.

Я бы применил что-то в pop, где перед тем, как вы на самом деле назовете контроллер вида, вы вызываете cancel на ваш NSOperation (возможно, здесь есть загрузочный счетчик или наложение). Затем дождитесь, пока значения cancelled и finished будут истинными, а executing будет ложным (или, по крайней мере, проверите некоторые из них и поэкспериментируйте, чтобы увидеть, какие из них вы можете избежать, не проверяя).

Важно то, что внутри каждого блока, который вы добавляете в NSOperation, есть логика, которая проверяет, была ли вызвана cancel. Но, это сложно, как если бы ваш блок просто проверял в начале, если он должен отменить, может быть, в этом случае будет хорошо. Возможно, после этого он выполнит некоторую асинхронную задачу, и если в этот момент вы вызовете cancel, это ничего не сделает, поскольку ваш блок больше не защищает от вызова отмены.

Мое предположение, что вы звоните cancel, но на самом деле не дожидаетесь, пока операция не исчезнет, ​​закончил KVO и отменил все.

Я не уверен, что ваш вопрос был сугубо оценен, узнав о NSOperation, но если бы это было не так, AFAIK, AFNetworking отлично справляется со всем этим. Особенно при загрузке ImageViews асинхронно (это то, что этот учебник, кажется, покрывает этот материал NSOperation). AFNetworking добавляет категорию в UIImageView, называемую UIImageView+AFNetworking, которая предоставляет метод под названием setImageWithURL:. Это заботится обо всех этих проблемах и обеспечивает кэширование. Установите AFNetworking, затем

#import "UIImageView+AFNetworking.h"

и вызвать

[self.imageView setImageWithURL:imageURL];.

Я знаю, что этот последний бит конкретно не отвечает на ваш вопрос, но, надеюсь, остальное помогает.

+0

Спасибо, я смог исправить эту проблему после того, как я отменил все операции, прежде чем появляться в контроллере просмотра. – iamarnold

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

  • Нет связанных вопросов^_^