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];
Ссылки на ссылки: