ios NSURLSession post:uploadTask和dataTask的区别

gzszwxb4  于 12个月前  发布在  iOS
关注(0)|答案(2)|浏览(147)

这是我的两个例子:

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


所以我想知道:这两个例子之间有什么区别,对我的情况更好(简单的邮政和接待)
两个人在后台,不是吗?那又怎样?

polkgigr

polkgigr1#

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

  • 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

当您需要使用HTTP POSTPUT命令将某些内容上传到Web服务时,请使用此类。任务的委托还允许您在传输时监视网络流量。
上传图片:

NSData *imageData = UIImageJPEGRepresentation(image, 0.6);

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


这里的任务是从一个会话中创建的,图像是以NSData的形式上传的。也有使用文件或流上传的方法。
然而,你的问题仍然很模糊,太宽泛了,因为你没有解释一个明确的,具体的问题,你可以很容易地通过搜索找到这些信息。

zujrkrfu

zujrkrfu2#

我问了一位苹果工程师同样的问题:
啊,我不知道URLSessionUploadTask可以处理短时间请求;我以为它只能处理长时间请求。谢谢!
URLSessionDataTask也支持通过URLRequest.httpBody的请求体。你知道使用URLSessionDataTaskURLSessionUploadTask来处理带有体的短期请求有什么区别吗?
苹果的@guoye-zhang说:
Upload task是data task的一个子类,所以它们之间的区别很小。建议在URLRequest上使用upload task而不是httpBody/httpBodyStream属性。上传/下载任务也有使用后台会话的好处(但你必须使用delegate而不是convenient或dockerc方法)。

相关问题