NSURLSession post:uploadTask和dataTask之间的区别

Aym*_*rks 12 post http background-process ios 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)")
        }
Run Code Online (Sandbox Code Playgroud)

和第二个

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)")
        }
Run Code Online (Sandbox Code Playgroud)

所以我想知道:这两个例子之间的区别是什么,对我的情况更好(简单的帖子和接收)

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

Nee*_*eku 8

NSURLSession课堂参考:

dataTaskWithRequest:

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

请求

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

回报价值

新的会话数据任务.

讨论

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

可用性

适用于iOS 7.0及更高版本.

宣告进入

NSURLSession.h


uploadTaskWithRequest:fromData:

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

请求

NSURLRequest,提供的网址,缓存策略对象,请求类型,等等.此请求对象中的正文流和正文数据将被忽略.

bodyData

请求的正文数据.

回报价值

新会话上传任务.

讨论

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

可用性

适用于iOS 7.0及更高版本.

宣告进入

NSURLSession.h

此外,Ray Wenderlich说:

NSURLSessionDataTask

此任务发出HTTP GET请求以从服务器下载数据.数据以表格形式返回NSData.然后,您可以将此数据转换为正确的类型XML,JSON,UIImage,plist,等.

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

NSURLSessionUploadTask

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

上传图片:

NSData *imageData = UIImageJPEGRepresentation(image, 0.6);

NSURLSessionUploadTask *uploadTask =
  [upLoadSession uploadTaskWithRequest:request
                              fromData:imageData];
Run Code Online (Sandbox Code Playgroud)

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

但是你的问题仍然很模糊和过于广泛,因为你没有解释一个明确的,具体的问题,你可以通过搜索一点点轻松找到这些信息.

  • 我认为这个问题一点也不含糊。问题在于发布的确切代码以及使用 dataTask 在 URLRequest 中传递 JSON 正文数据与在 uploadTask 中传递 JSON 正文数据是否有区别。苹果文档中没有任何内容明确回答是否存在差异或建议采取何种路线。 (6认同)