web-dev-qa-db-ja.com

NSURLSessionデリゲートと完了ハンドラ

私は常に補完ハンドラーを使用してきました。 NSURLConnectionあり、現在はNSURLSession付き。それは私のコードが本当に乱雑になることにつながりました、特に私はリクエスト内のリクエスト内にリクエストがあります。

NSURLSessionでデリゲートを使用して、NSURLConnectionで整然と実行したことを実装したいと思いました。

そこで、NSURLSessionを作成し、dataTaskを作成しました。

NSURLSessionDataTask *dataTask = [overallSession dataTaskWithURL:url
                                                  completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                                      if(error == nil)
                                                      {
                                                          NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
                                                          NSLog(@"Data = %@",text);
                                                      }

                                                  }];

    [dataTask resume];

現在、応答用のcompletionHandlerがありますが、応答とデータを管理するためにデリゲートにどのように切り替えますか?そして、このデリゲートから別のdataTaskを追加できますか?このdataTaskが作成してセッションに配置したCookieを使用しますか?

20
AndrewSB

カスタムデリゲートクラスを追加する場合は、少なくともNSURLSessionDataDelegateおよびNSURLSessionTaskDelegateプロトコルを実装する必要があります。

メソッドで:

NSURLSessionDataDelegate-リクエストの継続的なステータスを取得します

 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response
 completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler {

    receivedData=nil; receivedData=[[NSMutableData alloc] init];
    [receivedData setLength:0];

    completionHandler(NSURLSessionResponseAllow);
}

NSURLSessionDataDelegate

-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
   didReceiveData:(NSData *)data {

    [receivedData appendData:data];
}

NSURLSessionTaskDelegate

 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error {
 if (error) {
  // Handle error
 }
else {
   NSDictionary* response=(NSDictionary*)[NSJSONSerialization JSONObjectWithData:receivedData options:kNilOptions error:&tempError];
    // perform operations for the  NSDictionary response
}

デリゲートコード(中間層)を呼び出しクラスから分離したい場合(通常、ネットワーク呼び出し用に別のクラス/レイヤーを用意することをお勧めします)、NSURLSessionのデリゲートは次のようにする必要があります。

NSURLSession *session=[NSURLSession sessionWithConfiguration:sessionConfig delegate:myCustomDelegateClass delegateQueue:nil];

参照リンク:

  1. NSURLSessionクラスリファレンス
  2. iOS NSURLSessionの例(HTTP GET、POST、Background Downlads)
  3. NSURLConnectionからNSURLSessionへ
41
Vacca