Делегат NSURLSession по сравнению с завершениемHandler

Я всегда использовал обработчики завершения. С 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 из этого делегата? Использование файлов cookie, которые этот dataTask создан и помещен в сеанс?

Ответы

Ответ 1

Если вы хотите добавить пользовательский класс делегатов, вам нужно как минимум реализовать протоколы 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];

Ссылки ссылки: