Методы IUS5 NSURLConnection устарели

Я пытаюсь написать приложение iOS, которое делает асинхронные запросы для получения данных по сети. Похоже, что многие люди рекомендуют использовать NSURLConnection для этого и часто упоминают соединение метода делегата: didReceiveData:.

К сожалению, я не могу для жизни меня узнать, где этот метод делегата документирован. Во-первых, это не в ссылке протокола для NSURLConnectionDelegate. Он указан в ссылке NSURLConnection Class Reference, но, по-видимому, он устарел от iOS5. Документация не объясняет, почему она устарела, или что разработчики должны использовать для достижения аналогичной функциональности.

Что мне не хватает? Многие из того, что я прочитал, по-видимому, подразумевают, что в NSURLConnection для iOS5 были внесены большие изменения. Где эти изменения документированы? Документация по методам делегатов завершена?

Спасибо

Ответ 1

Обход файлов заголовков говорит мне, что методы были перенесены из неофициального протокола (который является устаревшим шаблоном Obj-C) в формальный протокол делегатов с именем NSURLConnectionDataDelegate, который находится в NSURLConnection.h, но не имеет публичная документация.

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

Ответ 2

Документация действительно беспорядок, хотя, глядя на журнал изменений от 4.3 до 5.0 для NSURLConnection.h:

Удалено

Removed -[NSObject connection:canAuthenticateAgainstProtectionSpace:]
Removed -[NSObject connection:didCancelAuthenticationChallenge:]
Removed -[NSObject connection:didFailWithError:]
Removed -[NSObject connection:didReceiveAuthenticationChallenge:]
Removed -[NSObject connection:didReceiveData:]
Removed -[NSObject connection:didReceiveResponse:]
Removed -[NSObject connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:]
Removed -[NSObject connection:needNewBodyStream:]
Removed -[NSObject connection:willCacheResponse:]
Removed -[NSObject connection:willSendRequest:redirectResponse:]
Removed -[NSObject connectionDidFinishLoading:]
Removed -[NSObject connectionShouldUseCredentialStorage:]
Removed NSObject(NSURLConnectionDelegate)

Добавлено

Added -[NSURLConnection currentRequest]
Added -[NSURLConnection originalRequest]
Added +[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]
Added -[NSURLConnection setDelegateQueue:]
Added NSURLConnectionDataDelegate
Added -[NSURLConnectionDataDelegate connection:didReceiveData:]
Added -[NSURLConnectionDataDelegate connection:didReceiveResponse:]
Added -[NSURLConnectionDataDelegate connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:]
Added -[NSURLConnectionDataDelegate connection:needNewBodyStream:]
Added -[NSURLConnectionDataDelegate connection:willCacheResponse:]
Added -[NSURLConnectionDataDelegate connection:willSendRequest:redirectResponse:]
Added -[NSURLConnectionDataDelegate connectionDidFinishLoading:]
Added NSURLConnectionDelegate
Added -[NSURLConnectionDelegate connection:canAuthenticateAgainstProtectionSpace:]
Added -[NSURLConnectionDelegate connection:didCancelAuthenticationChallenge:]
Added -[NSURLConnectionDelegate connection:didFailWithError:]
Added -[NSURLConnectionDelegate connection:didReceiveAuthenticationChallenge:]
Added -[NSURLConnectionDelegate connection:willSendRequestForAuthenticationChallenge:]
Added -[NSURLConnectionDelegate connectionShouldUseCredentialStorage:]
Added NSURLConnectionDownloadDelegate
Added -[NSURLConnectionDownloadDelegate connection:didWriteData:totalBytesWritten:expectedTotalBytes:]
Added -[NSURLConnectionDownloadDelegate connectionDidFinishDownloading:destinationURL:]
Added -[NSURLConnectionDownloadDelegate connectionDidResumeDownloading:totalBytesWritten:expectedTotalBytes:]
Added NSURLConnection(NSURLConnectionQueuedLoading)

Итак, кажется, что эти функции действительно существуют. Просто добавьте протоколы к объявлению @interface, и вам должно быть хорошо идти.

Я попробовал новый NSURLConnectionDownloadDelegate, предупреждаю, что если эти методы присутствуют в вашем делетете, ваши методы NSURLConnectionDataDelegate НЕ будут вызываться.

У меня также возникла проблема с открытием destinationURL, iOS продолжал сообщать мне, что файл не существует, хотя документация указывает, что файл будет существовать во время вызова метода.

Ответ 3

Документация представляет собой беспорядок @[email protected]# $. Это настоящая история.

Документация по NSURLConnection, как написано, оставляет вас сухими и сухими.

Первая часть документации говорит вам использовать различные методы в протоколе NSURLConnection (например, connection: didReceiveData:) для обработки входящих данных. Если вы нажмете на любой из этих методов в обзоре, он приведет вас к списку DEPRECATED METHODS!)

Реальная история, которую я смог собрать, заключается в том, что большинство методов, ранее использовавшихся в NSURLConnectionProtocol, были перенесены на новый протокол NSURLConnectionDataProtocol. К сожалению, этот новый протокол либо не документирован, либо не индексирован, поэтому вы не можете его найти. Это то же самое.)

В других интересных новостях, по-видимому, появился новый протокол NSURLConnectionDownloadDelegate. Похоже, NSURLConnection для iOS добавляет некоторые функции, доступные в NSURLDownload в MacOS. Протокол NSURLConnectionDownloadDelegate задокументирован.

Ответ 4

Вы считаете, что отказ от этих методов из NSURLConnection может потребовать объяснений, но я еще не нашел их. Лучшее, что я мог сделать до сих пор, - это Apple Руководство по программированию URL-адреса URL:

Чтобы загрузить содержимое URL-адреса, приложение должно предоставить объект-делегат, который, как минимум, реализует следующие методы-делегаты: connection:didReceiveResponse:, connection:didReceiveData:, connection:didFailWithError: и connectionDidFinishLoading:

что подразумевает неофициальный протокол.