我正在编写简单的处理程序,用于与服务器(当前为本地)上的 REST API 进行通信。到目前为止,从/向服务器下载和上传数据一切顺利。
我现在想要实现的是能够处理上传数据后服务器返回的 JSON 响应。这条消息是这样的:
{"message":"Record successfully added.","recordID":30}
对我来说重要的是recordID,因为我需要将它分配给相关的 NSManagedObject。我使用委托态度而不是完成处理程序,因此我可以管理上传进度。适当的委托类使用所有方法实现这些协议:
class ConstructoHTTPHelper:NSObject, URLSessionDelegate, URLSessionDataDelegate, URLSessionTaskDelegate, URLSessionDownloadDelegate, URLSessionStreamDelegate { ... }
问题来了,因为据我创建上传任务是这样的:
let config = URLSessionConfiguration.default
self.session = URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue.main) //URLSession(configuration: config)
var request:URLRequest = URLRequest(url:address)
request.httpMethod = "POST"
let data = // creation of data ...
let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("uploadData")
do {
try data.write(to: fileURL)
} catch {
// handling error
}
self.sessionUploadTask = self.session?.uploadTask(with: request, fromFile: fileURL)
self.sessionUploadTask!.resume()
处理数据的委托函数:
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {}
服务器返回的永远不会被调用。对我来说奇怪的是,当我使用下面的完成处理程序时,它可以很好地打印 JSON:
self.sessionUploadTask = self.session?.uploadTask(with: request, from: data, completionHandler: { (data, response, error) in
print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue)!)
})
因此,在我看来,uploadTask 以这种方式受到限制。有什么建议么?
谢谢