NSURLSession委托与completionHandler

And*_*wSB 20 delegates objective-c nsurlconnection ios 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];
Run Code Online (Sandbox Code Playgroud)

现在我有一个completionHandler响应,我将如何切换到委托来管理响应和数据?我可以dataTask从这个代表中添加另一个吗?使用这个dataTask创建并放入会话的cookie ?

Vac*_*cca 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);
}
Run Code Online (Sandbox Code Playgroud)

NSURLSessionDataDelegate

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

    [receivedData appendData:data];
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

如果要将委托代码(中间层)与调用类分开(通常是为网络调用分别具有单独的类/层),NSURLSession的委托必须是: -

NSURLSession *session=[NSURLSession sessionWithConfiguration:sessionConfig delegate:myCustomDelegateClass delegateQueue:nil];
Run Code Online (Sandbox Code Playgroud)

参考链接:

  1. NSURLSession类参考
  2. iOS NSURLSession示例(HTTP GET,POST,背景下载)
  3. 从NSURLConnection到NSURLSession

  • 如果多个并发请求可以同时处于飞行状态,则此方法将无法工作,因为您将来自不同任务的数据一起追加.在这种情况下,使用字典仅附加属于特定任务的数据. (2认同)
  • 你可以做所有这些事情,但一般情况下,除非你在接收所有数据之前进行自定义身份验证,自定义缓存或尝试使用数据(例如,部分解析网页以便尽快开始渲染),它是通常更干净,使用回调并将结果数据移交给方法,如果事情变得太嵌套和混乱.只需我0.02美元. (2认同)