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 от делегата этого? Используя куки, которые это 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];

Ссылки на ссылки:

  1. Ссылка на класс NSURLSession
  2. Пример NSURLSession для iOS (HTTP GET, POST, фоновые загрузки)
  3. От NSURLConnection к NSURLSession
Другие вопросы по тегам