iOS5 NSURLC методы соединения устарели - PullRequest
65 голосов
/ 23 октября 2011

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

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

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

Спасибо

Ответы [ 4 ]

47 голосов
/ 23 октября 2011

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

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

24 голосов
/ 09 декабря 2011

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

7 голосов
/ 02 ноября 2011

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

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

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

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

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

0 голосов
/ 25 октября 2011

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

от Apple .Как минимум, реализует следующие методы делегата: connection:didReceiveResponse:, connection:didReceiveData:, connection:didFailWithError: и connectionDidFinishLoading:

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

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