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