NSURLSession 帖子:uploadTask 和 dataTask 之间的区别

问题描述 投票:0回答:2

这是我的两个例子:

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
2个回答
6
投票

来自

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
对象,提供 URL、缓存策略、请求 类型等。该请求对象中的主体流和主体数据 被忽略。

身体数据

请求的正文数据。

返回值

新的会话上传任务。

讨论

创建任务后,必须通过调用其

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
}];

NSURLSessionUploadTask

当您需要将某些内容上传到网络服务时,请使用此类 使用

HTTP POST
PUT
命令。任务代表也 允许您在传输时观察网络流量。

上传图片:

NSData *imageData = UIImageJPEGRepresentation(image, 0.6);

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

这里任务是从会话创建的,图像上传为

NSData
。还有使用文件或流上传的方法。

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


0
投票

问了同样的问题给苹果工程师:

啊,我没有意识到

URLSessionUploadTask
可以做短暂的请求;我认为这仅适用于长期请求。谢谢!

URLSessionDataTask
还支持通过
URLRequest.httpBody
的请求正文。您知道使用
URLSessionDataTask
URLSessionUploadTask
对于机构的短期请求有什么区别吗?

来自苹果的

@guoye-zhang

上传任务是数据任务的子类,因此两者之间没有什么区别。建议使用上传任务而不是

httpBody
上的
httpBodyStream
/
URLRequest
属性。上传/下载任务还具有使用后台会话的好处(但您必须使用委托而不是方便的方法或异步方法)。

© www.soinside.com 2019 - 2024. All rights reserved.