2017-06-05 59 views
1

我正在編寫用於與服務器上的REST API通信的簡單處理程序(當前爲本地)。從下載和上傳服務器數據到目前爲止,一切順利。通過URLSessionUploadTask響應數據

我現在想要實現的是能夠處理上傳數據後服務器返回的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:

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以這種方式限制。有什麼建議麼?

感謝

+0

https://stackoverflow.com/a/44362939/5461400檢查這個@jan R. –

+0

謝謝,但正如我在帖子中寫道它,完成處理工作正常,這對我來說......但我需要使用委託方法,而不是completionHandler,因爲能夠觀察會話的進度... –

+0

https://stackoverflow.com/a/40503024/5461400在這裏檢查@Jan R. –

回答

1

我可能已經找到了答案,只是將此添加到URLSession:dataTask:didReceiveResponse:completionHandler:委託方法。

completionHandler(URLSession.ResponseDisposition.allow) 

我找到了解決方案,this thread.

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) 
} 
+0

感謝您的代碼,但它並沒有幫助。問題是在上傳過程中或上傳後,上述方法(didCompleteWithError和didReceive數據)都沒有被調用。 –

相關問題