NSURLSession post:uploadTask和dataTask之间的区别

时间:2014-08-26 11:32:10

标签: ios http post background-process nsurlsession

这是我的两个例子:

let config = NSURLSessionConfiguration.defaultSessionConfiguration()
        config.HTTPAdditionalHeaders = ["Accept": "application/json",
                                        "Content-Type": "application/json",
                                        "User-Agent": UIDevice.currentDevice().model]


        var request = NSMutableURLRequest(URL: NSURL(string: "http://XXX"))
        request.HTTPMethod = "POST"

        let valuesToSend = ["key":value, "key2":value]
        var error: NSError?
        let data = NSJSONSerialization.dataWithJSONObject(valuesToSend, options:NSJSONWritingOptions.PrettyPrinted, error: &error)
        request.HTTPBody = data

        if error == nil {
            let task = NSURLSession(configuration: config).dataTaskWithRequest(request,
                completionHandler: {data, response, error in

                if error == nil {
                    println("received == \(NSString(data: data, encoding: NSUTF8StringEncoding))")
                }
            })

            task.resume()

        } else {
            println("Oups error \(error)")
        }

和第二个

let config = NSURLSessionConfiguration.defaultSessionConfiguration()
        config.HTTPAdditionalHeaders = ["Accept": "application/json",
                                        "Content-Type": "application/json",
                                        "User-Agent": UIDevice.currentDevice().model]


        var request = NSMutableURLRequest(URL: NSURL(string: "http://XXX"))
        request.HTTPMethod = "POST"

        let valuesToSend = ["key":value, "key2":value]
        var error: NSError?
        let data = NSJSONSerialization.dataWithJSONObject(valuesToSend, options:NSJSONWritingOptions.PrettyPrinted, error: &error)

        if error == nil {

            let task = NSURLSession(configuration: config).uploadTaskWithRequest(request, fromData: data,
                completionHandler: {data, response, error in

                if error == nil {
                    println("received == \(NSString(data: data, encoding: NSUTF8StringEncoding))")
                }
            })

            task.resume()


        } else {
            println("Oups error \(error)")
        }

所以我想知道:这些两个例子之间有什么不同,对我的情况有什么好处(简单的帖子和接收)

这两个人在背景中没有?那么?

1 个答案:

答案 0 :(得分:7)

来自NSURLSession Class Reference

  

dataTaskWithRequest:

     

根据指定的URL请求对象创建HTTP请求。 - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request   的参数

     

请求

     

提供特定于请求的信息(如URL)的对象   缓存策略,请求类型和正文数据或正文流。

     

返回值

     

新会话数据任务。

     

<强>讨论

     

创建任务后,必须通过调用其简历启动它   方法

     

<强>状况

     

适用于iOS 7.0及更高版本。

     

声明

     

NSURLSession.h


  

uploadTaskWithRequest:fromData:

     

为指定的URL请求对象创建HTTP请求   上传提供的数据对象。 - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData   的参数

     

请求

     

NSURLRequest对象,提供URL,缓存策略,请求   类型,等等。此请求对象中的正文流和正文数据   被忽略了。

     

bodyData

     

请求的正文数据。

     

返回值

     

新会话上传任务。

     

<强>讨论

     

创建任务后,您必须通过调用resume来启动它   方法

     

<强>状况

     

适用于iOS 7.0及更高版本。

     

声明

     

NSURLSession.h

另外,Ray Wenderlich说:

  

<强> NSURLSessionDataTask

     

此任务发出HTTP GET请求以从服务器下载数据。该   数据以NSData的形式返回。然后,您将转换此数据   正确的类型XMLJSONUIImageplist等。

NSURLSessionDataTask *jsonData = [session dataTaskWithURL:yourNSURL
      completionHandler:^(NSData *data,
                          NSURLResponse *response,
                          NSError *error) {
        // handle NSData
}];

  

<强> NSURLSessionUploadTask

     

当您需要将某些内容上传到Web服务时,请使用此类   使用HTTP POSTPUT命令。任务的代表也   允许您在传输时观察网络流量。

     

上传图片:

NSData *imageData = UIImageJPEGRepresentation(image, 0.6);

NSURLSessionUploadTask *uploadTask =
  [upLoadSession uploadTaskWithRequest:request
                              fromData:imageData];
     

此处任务是从会话创建的,图像上传为   NSData。还有使用文件或流上传的方法。

但是你的问题仍然很模糊,而且范围太广,因为你没有解释明确的具体问题,你可以通过搜索一下来轻松找到这些信息。