响应数据通过URLSessionUploadTask

时间:2017-06-05 12:04:50

标签: ios json swift xcode urlsession

我正在编写简单的处理程序,用于在服务器(当前是本地)上与REST API进行通信。到目前为止,从服务器下载和上传数据到目前为止一切顺利。

我现在想要实现的是能够在上传数据后处理服务器返回的JSON响应。这条消息是这样的:

{"message":"Record successfully added.","recordID":30}

对我来说重要的是 recordID ,因为我需要将它分配给相关的NSManagedObject。我使用委托态度而不是completionHandler,因此我可以管理上传的进度。适当的委托类使用所有方法实现这些协议:

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以这种方式受到限制。有什么建议吗?

由于

2 个答案:

答案 0 :(得分:1)

试试这个!,将NSMutableData作为缓冲区全局

fileprivate var buffer:NSMutableData = NSMutableData()

并在您的URLSession委托方法中添加

func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
  if let _ = error {
        print(error!.localizedDescription)
    }else {
      // do your parsing with buffer here.
    }
}

func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
    buffer.append(data)
}

答案 1 :(得分:1)

我可能找到了答案,只需将其添加到URLSession:dataTask:didReceiveResponse:completionHandler:delegate method。

completionHandler(URLSession.ResponseDisposition.allow)

我在this thread.

中找到了解决方案