2011-10-18 3 views
29

私はNSURLConnectionクラスを見ていましたが、URLへの同期または非同期接続を確立し、そのデータを取得するために使用できます。このクラスには多くの変更が加えられていますIOS 5と私は彼らが認証やダウンロードに関連するいくつかの正式なプロトコルを導入したのを見てきましたが、例えば、connection:didReceiveResponse:メッセージ(それ以前にデリゲートに送られていて、いくつかのプロトコルで利用可能です。応答を受信するとすぐに、非同期接続を実装し、たとえばHTTPヘッダーを取得するにはどうすればよいですか?私は、NSURLConnectionconnection:didReceiveResponse:というメッセージを併用するよりも良い方法があると確信しています。stringWithContentsOfURLのようなメソッドは常にコンテンツを同期して読み込みますか?アプリケーションで非同期ダウンロードを実装するために、非推奨のメソッドを避け、_http response received_mなどのイベントに反応するために使用するものは何ですか?可能であれば、バックグラウンドタスクで同期ダウンロードを起動しますか?NSURLConnectionメソッドはIOS5ではこれ以上使用できません

+0

あなたの質問は複数の質問に分割する必要があります。あなたの質問の中に潜在的に5つの質問があります。私の答えは、私があなたの最大の問題であると認識していること、すなわちiOS 4.3で利用可能だった接続代理メソッドの明白な除去を扱っています。 –

答えて

68

NSURLConnectionDelegateは正式なプロトコル(以前のバージョンでは非公式プロトコル)になっています。このプロトコルでは、以下の(非廃止予定の)方法が宣言されている:

  • connection:didFailWithError:
  • connectionShouldUseCredentialStorage:
  • connection:willSendRequestForAuthenticationChallenge:

はまた、NSURLConnectionDelegateに適合2つのサブプロトコルがあります

NSURLConnectionDataDelegateは、データをメモリにロードするデリゲートに使用され、次のmetho私は確信しているそのうちのいくつかは、DS、あなたはおなじみ見つける:

  • connection:willSendRequest:redirectResponse:
  • connection:didReceiveResponse:
  • connection:didReceiveData:
  • connection:needNewBodyStream:
  • connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:
  • connection:willCacheResponse:
  • connectionDidFinishLoading:

NSURLConnectionDownloadDelegateは、ディスクファイルに直接データを保存する代表団のために使用され、次のメソッドを宣言している:あなたが見ることができるように

  • connection:didWriteData:totalBytesWritten:expectedTotalBytes:
  • connectionDidResumeDownloading:totalBytesWritten:expectedTotalBytes:
  • connectionDidFinishDownloading:destinationURL:

以前のデリゲートをそのまま使用することができます。

詳細については、ローカルXcodeインストールのiOS 4.3 to iOS 5.0 API Differences documentおよびNSURLConnection.hを参照してください。新しいSDKバージョンがリリースされると、ヘッダーファイル内のドキュメントが開発者用ライブラリで利用可能なドキュメントよりも信頼性が高くなることは珍しくありません。後者が最新であるにはしばらく時間がかかります。

+0

ありがとうございました...参照ドキュメントがまだ更新されていないので、APIの差分ドキュメントとヘッダーファイルは良いスタートポイントです。 ..)そのドキュメントは、通常あなたのアプリはNSURLConnectionDataDelegateプロトコルを実装してはならないと言っています...私が間違っているかどうか教えてください:ダウンロードプログレスバーの種類を実装する必要がある場合、doReceiveDataを使用して、データを少しダウンロードしたか、didReceiveDataがどのように動作し、いつ送信されたのか誤解しましたか? –

+0

@Gianniはい、 ' - ... didReceiveData:'がデリゲートに送信され、データが受信されたことを通知します。これらのデータを保存するほかに、ダウンロードプログレスバーを更新するために使用することができます。 –

+0

FYI、04/08/12現在、5.1 SDKのマニュアルにはNSURLConnectionDataDelegate(オンラインでもSDK内でもない)に関する完全なリファレンスはまだありません。 –

2

この同じ問題が発生しました。非同期リクエストの送信はブロックとNSOperationQueueでより簡単になります。

+ (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler 

これは、代理人が認証と障害の問題にのみ使用されるようになったことを意味します。

+0

ありがとう、私は参照文書でそれを見つけることができませんでした、多分それはすぐに更新されます。 –

+1

通常これは現在更新されています。ただし、この方法はiOS 4.3では使用できないため注意してください。まとめると、iOS 4.3とiOS 5.0との互換性を維持するには、両方の方法を実装する必要があります。 –

-1

でも、私はhaventははNOそれはここ

2

上で利用されている必要がありますアップルのWebサイト

https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html

https://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSURLConnectionDelegate_Protocol/Reference/Reference.html

上のドキュメントを見つけました! Appleのライブラリを注意深く見れば、認証や障害の問題に限定されません。

NSConnectionクラスオブジェクトに+(void)sendAsynchronousRequest:queue:completionHandler:を導入して以来、前にできるだけ多くのNSConnectionDelegate方法を実行することができ、多くの事は今NSURLConnection方法に多くの機能を追加するための新しい部屋を開く、「NSConnectionDataDelegate」& NSConnectionDownloadDelegateと呼ばれる正式なプロトコルで使用することができます。 (iOS5から)

だから私はそれが改善されていると考えています。

関連する問題