NSURLSession委托与completionHandler

时间:2014-03-26 06:31:24

标签: ios objective-c delegates nsurlconnection 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?

1 个答案:

答案 0 :(得分:41)

如果要添加自定义委托类,则需要至少实施NSURLSessionDataDelegateNSURLSessionTaskDelegate协议。

使用方法:

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 Class Reference
  2. iOS NSURLSession Example (HTTP GET, POST, Background Downlads )
  3. From NSURLConnection to NSURLSession