ASIHTTPRequest popViewControllerAnimated: => делегировать EXEC_BAD_ACCESS - PullRequest
0 голосов
/ 29 июня 2011

Я установил контроллер представления как делегат локальной переменной ASIHTTPFormDataRequest request.

Но, нажав «Назад» до завершения запроса, выскочит и освободит контроллер представления.Итак, когда запрос завершается и отправляет сообщение -requestDidFinish: уже не существующему делегату, приложение вылетает с исключением EXEC_BAD_ACECESS.

Как я могу исправить это падение?

  1. Один из способов решить эту проблему - установить делегат равным nil сразу после того, как его отобразит навигационный контроллер.Но если это решение, как мне это сделать?(Ссылки ARC weak были бы хороши прямо сейчас.)

  2. Другой способ, о котором я могу подумать, - это сделать request переменной экземпляра контроллера представления и вызвать [request clearDelegatesAndCancel]; [request release]; inметод dealloc контроллера представления.Этот подход описан в Пример кода ASIHTTPRequest , но мне советовали, что лучше делать запросы локальными переменными вместо переменных экземпляра.И этот конкретный контроллер представления является контроллером представления таблицы настроек и имеет 13 переключателей.Для автоматического сохранения на сервере каждый коммутатор создает и отправляет новый запрос при каждом переключении.Если бы я сделал ивар, мне пришлось бы сделать 13. Это много кода!

Мысли?Идеи?

Ответы [ 2 ]

3 голосов
/ 29 июня 2011

Я думаю, что первый вопрос: что вы хотите, чтобы произошло , если пользователь нажимает после нажатия переключателя? то есть. Следует ли отменить http-запрос или важно, чтобы этот запрос попал на сервер? На данный момент я предполагаю, что вы действительно хотите отменить их, как это, по-видимому, подразумевается в вашем вопросе.

Мне посоветовали сделать запрашивает локальные переменные вместо переменные экземпляра

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

Для вашего случая вы можете рассмотреть возможность использования NSOperationQueue.

Грубые шаги для этого были бы:

  1. Создайте NSOperationQueue в init контроллера вашего представления.
  2. Если вы хотите сделать http-запрос, добавьте его в очередь ASIHTTPRequest вместо вызова startAsynchronous
  3. В dealloc итерируйте объекты в очереди, вызывая [request clearDelegatesAndCancel]; для каждого, а затем освобождайте очередь.

Это должно решить проблему, не требуя 13 иваров!

0 голосов
/ 30 июня 2011
...