NSURLConnection по-прежнему вызывает делегат ПОСЛЕ вызова метода отмены - PullRequest
2 голосов
/ 24 марта 2010

Возникла проблема с NSURLConnection, если я создаю NSURLConnection и вызываю [connection connectionWithRequest], пусть он немного загружается, а затем вызывает [отмену подключения] большую часть времени, что работает нормально. Однако иногда даже после того, как я вызываю [Отмена соединения], делегат соединения все равно вызывается (что приводит к сбою приложения). Поиск в Google выглядит так, как будто проблема здесь в состоянии гонки в цикле выполнения, я отменяю соединение и освобождаю делегата, но перед циклом цикла запуска он вызывает функции делегата -> crash.

Есть ли способ для меня после того, как я позвоню [соединение отменить], чтобы подтвердить, что соединение фактически было отменено? Даже дурацкий цикл while () сделает: (

Ответы [ 2 ]

6 голосов
/ 24 марта 2010

Вы не должны освобождать соединение и связанное хранилище, пока ваш делегат не получит сообщение connectionDidFinishLoading: или connectionDidFailWithError:.

Обычно делегаты не удерживаются объектом, для которого они действуют как делегат . Однако в этом случае это так, поэтому делегат не должен становиться недействительным, пока NSURLConnection все еще ссылается на него, если вы как-то его не переусердствовали.

0 голосов
/ 12 марта 2012

Я еще не сталкивался с этой проблемой, но это также может работать без привязки вашего объекта делегата:

Поскольку все методы делегата получают вызывающий объект Connection в качестве параметра и вы также знаете свой фактический активный объект Connection (или nil), просто проигнорируйте действия делегирования, сравнив два объекта. Таким образом, отмененный «призрачный» объект Connection может по-прежнему вызывать делегат, но не мешать его внутренним элементам.

- (void) connection:(NSURLConnection*) connection didReceiveData:(NSData*) data
{
    if(connection != _URLConnection){return;}
    ...
    [_incomingData appendData:data];
    ...
}

где _URLConnection - это свойство в вашем делегате, для которого установлено активное соединение, или ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...