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

#ios #ios5

#iOS #ios5

Вопрос:

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

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

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

Спасибо

Комментарии:

1. Излишне говорить, что эти методы теперь перечислены в ссылке на протокол NSURLConnectionDataDelegate.

Ответ №1:

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

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

Комментарии:

1. Если мы намерены поддерживать iOS4, должны ли мы включать этот делегат только после проверки версии iOS?

2. @aiham Понятия не имею, извини. Я не думаю, что это должно быть проблемой, если сигнатуры методов одинаковы, но у меня нет средств проверить это.

3. Это не должно быть проблемой, нет.

4. теперь это в документе: developer.apple.com/library/ios/#documentation/Foundation /. … И это должно работать для iOS> 3.0

Ответ №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 продолжала говорить мне, что файл не существует, хотя в документации указано, что файл гарантированно существует во время вызова метода.

Комментарии:

1. не могли бы вы добавить ссылку на источник журнала изменений?

2. developer.apple.com/library/ios/releasenotes/General/…

Ответ №3:

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

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

В первой части документации вам предлагается использовать различные методы в NSURLConnection протоколе (например connection:didReceiveData: ) для обработки входящих данных. Если вы нажмете на любой из этих методов в обзоре, он приведет вас к списку УСТАРЕВШИХ МЕТОДОВ!)

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

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

Комментарии:

1. Я полностью согласен. Эта документация представляет собой беспорядок, руководство по программированию загрузки URL не обновлено в официальном iOS5.0 SDK. Мы продолжим использовать старые протоколы…

2. Согласно тому, что я прочитал на форумах разработчиков Apple, в настоящее время NSURLConnectionDownloadDelegate работает только в связи с классами NK (Newsstand Kit). По-видимому, в Apple была зарегистрирована ошибка, и в конечном итоге она может работать с NSURLConnection.

Ответ №4:

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

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

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