Создание задач NSURLSession

Сейчас я работаю над вспомогательным классом NetworkCommunicator, который будет обрабатывать мое подключение к серверу, я использую API NSURLSession, и у меня есть вопрос о создании задач NSURLSession. Существует два способа создания такса:

1 - с NSURLRequest

2 - с URL

Мне было интересно, какой способ предпочтительнее? чтобы быть более конкретным, каким образом моя жизнь будет намного проще (добавление заголовков, настройка типов глаголов и т. д.).

Спасибо


person YYfim    schedule 04.04.2014    source источник


Ответы (2)


Вы гораздо более гибки, когда используете методы, которые принимают NSURLRequest, например метод dataTaskWithRequest:. Таким образом, вы можете настроить метод HTTP, тело запроса, заголовки, в основном каждый параметр NSURLRequest, потому что вы его создаете.

Методы, которые NSURL создают NSURLRequest для вас под капотом, чтобы вы не могли впоследствии изменить запрос. Например, метод dataTaskWithURL: создает запрос HTTP GET для указанного URL, и вы не можете изменить его на POST.

Пример создания задачи с NSURLRequest. Вы можете видеть, что вы можете быть очень гибкими здесь:

// Create a simple JSON data.
NSData *JSONData = [NSJSONSerialization dataWithJSONObject:@{ @"numbers" : @[@1, @2, @3] } options:0 error:nil];

// Create a POST request with our JSON as a request body.
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

// Set HTTP method.
request.HTTPMethod = @"POST";

// Set request body.
request.HTTPBody = JSONData;

// Create a task.
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request
                                                             completionHandler:^(NSData *data,
                                                                                 NSURLResponse *response,
                                                                                 NSError *error)
{
    ...
}];

Пример создания задачи с помощью NSURL. Здесь вы не можете изменить запрос. Он создан для вас.

// Create a GET task.
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url
                                                         completionHandler:^(NSData *data,
                                                                             NSURLResponse *response,
                                                                             NSError *error)
{
 ...
}];
person Rafa de King    schedule 04.04.2014

Я не думаю, что есть предпочтительный способ, или, по крайней мере, не явный для Apple.

Вопрос больше о том, какую гибкость вы хотите предоставить вызывающей стороне, позволяя вызывающей стороне использовать NSURLRequest, что означает, что вызывающая сторона может выполнять дополнительные настройки по запросу, и, например, вызываемый может, установив правильное свойство в NSURLRequest, чтобы переопределить некоторые настройки, выполненные в файле NSURLSessionConfiguration.

Я думаю, что в целом вы хотите предоставить и то, и другое; тот, который позволяет установить NSURL, является прокси через тот, который будет использовать NSURLRequest. По сути, метод NSURL будет просто удобным методом для вызывающего абонента, если вызывающий абонент не заинтересован в тонкой настройке запроса, он отправит вам NSURL, в противном случае установит вам NSURLRequest.

Если вы разрабатываете API такого типа, я могу дать вам общий совет: всегда копируйте, чтобы иметь неизменяемую версию параметра, который вы получаете. Это связано с тем, что вызывающая сторона может передать вам изменяемый объект (NSMutableURLRequest), и вы не хотите, чтобы вызывающая сторона возилась с вашими внутренними компонентами.

person Luca Bernardi    schedule 04.04.2014