NSURLSession任务创建

时间:2014-04-04 15:53:53

标签: ios objective-c nsurlsession

我现在在NetworkCommunicator Helper类上工作,它将处理我与服务器的连接,我使用NSURLSession API,我有一个关于创建NSURLSession任务的问题。 创建一个taks有两种方法:

1 - 使用NSURLRequest

2 - 带有网址

我想知道什么是首选方式?更具体地说,我的生活会更轻松(添加标题,设置动词类型等等)。

由于

2 个答案:

答案 0 :(得分:0)

当您使用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)
{
 ...
}];

答案 1 :(得分:0)

我认为没有一种首选的方式,或者至少不是Apple的明确方式。

问题更多的是您希望为调用者提供多大的灵活性,允许调用者使用NSURLRequest意味着调用者可以对请求进行更多自定义,例如被调用者能够,通过在NSURLRequest上设置正确的属性,覆盖NSURLSessionConfiguration中完成的某些配置。

我认为总的来说,你想提供两者;允许设置NSURL的是通过将使用NSURLRequest的代理。基本上NSURL方法对于调用者来说只是一种方便的方法,如果调用者对请求的细粒度设置不感兴趣,它将向您发送NSURL,否则将为您设置{{} 1}}。

如果您设计此类API,我可以给您的一般建议是始终向副本提供您收到的参数的不可变版本。这是因为调用者可以向您传递一个可变对象(NSURLRequest)并且您不希望允许调用者弄乱您的内部。