Създаване на задачи за NSURLSession

Сега работя върху клас NetworkCommunicator Helper, който ще управлява връзката ми със сървъра, използвам API на NSURLSession и имам въпрос относно създаването на задачите на NSURLSession. Има два начина за създаване на taks:

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