【问题标题】:NSURLSession post : difference between uploadTask and dataTaskNSURLSession post:uploadTask 和 dataTask 的区别
【发布时间】:2014-08-26 20:13:06
【问题描述】:

这是我的两个例子:

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)")
        }

所以我想知道:这两个示例之间有什么区别以及对我的情况更好的情况(简单的邮寄和接收)

这两个在后台不是吗?那么呢?

【问题讨论】:

  • 你有没有试过使用它们并在真实的编译代码中看到实际效果?
  • 是的。这是一个检查用户身份验证的真实项目。我没有看到任何差异。

标签: ios http post background-process nsurlsession


【解决方案1】:

来自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 参数

请求

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

身体数据

请求的正文数据。

返回值

新的会话上传任务。

讨论

创建任务后,必须通过调用其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。也有使用文件或流上传的方法。

但是您的问题仍然很模糊且过于宽泛,因为您没有解释明确的具体问题,您可以通过搜索一下轻松找到此信息。

【讨论】:

  • HTTP 新手在这里...如果我发出dataTaskWithRequest(),传递配置为POST 的请求会怎样?我第一次通过 https 向服务器发送凭据,以获取令牌。我将凭据 (JSON) 附加到请求的正文中,并为整个 NSURLSession 设置了授权标头。您上传任务的答案中的示例代码使用图像有效负载。我不知道它是否适用于我的情况,但我仍然想使用POST
  • @NicolasMiari:“数据任务使用 NSData 对象发送和接收数据。数据任务旨在用于从您的应用程序到服务器的简短的、通常是交互式的请求。数据任务可以将数据单件返回到您的应用程序在接收到每条数据后的一段时间,或者通过完成处理程序一次性完成。”见developer.apple.com/library/ios/documentation/Cocoa/Conceptual/… 所以你可以使用它。
  • 我认为这个问题一点也不含糊。问题在于发布的确切代码以及在 URLRequest 中使用 dataTask 传递 JSON 正文数据与在 uploadTask 中传递 JSON 正文数据是否存在差异。如果在此处采取的路线存在差异或建议,Apple 文档中没有任何内容可以明确回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 2011-10-20
相关资源
最近更新 更多