Данные ответа через URLSessionUploadTask

Я пишу простой обработчик для связи с REST API на сервере (в настоящее время локальный). Пока все идет хорошо с загрузкой и выгрузкой данных с/на сервер.

Сейчас я пытаюсь добиться того, чтобы иметь возможность обрабатывать ответ JSON, возвращаемый сервером после загрузки данных. Это сообщение примерно такое:

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

Для меня важен recordID, потому что мне нужно назначить его соответствующему NSManagedObject. Я использую отношение делегирования вместо завершенияHandler, чтобы я мог управлять ходом загрузки. Соответствующий класс делегата реализует эти протоколы со всеми методами:

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 ограничен таким образом. Какие-либо предложения?

Спасибо


person Jan R.    schedule 05.06.2017    source источник
comment
stackoverflow.com/a/44362939/5461400 проверьте это @jan R.   -  person Harshal Valanda    schedule 05.06.2017
comment
Спасибо, но, как я уже писал в своем посте, обработчик завершения отлично работает для меня... но мне нужно использовать подход делегата вместо завершенияHandler из-за возможности наблюдать за ходом сеанса...   -  person Jan R.    schedule 05.06.2017
comment
stackoverflow.com/a/40503024/5461400 проверьте здесь @Jan R.   -  person Harshal Valanda    schedule 06.06.2017
comment
Спасибо, честно говоря, это не похоже на ответ на мой вопрос... но спасибо...   -  person Jan R.    schedule 06.06.2017


Ответы (2)


Вероятно, я нашел ответ, просто добавьте это в URLSession:dataTask:didReceiveResponse:completionHandler: метод делегата.

completionHandler(URLSession.ResponseDisposition.allow)

Я нашел решение в этой теме.

person Jan R.    schedule 07.06.2017

попробуйте это !, получите 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)
}
person Raghav7890    schedule 05.06.2017
comment
Спасибо за код, но он не помогает. Проблема в том, что ни один из вышеперечисленных методов (didCompleteWithError и didReceive data) не вызывается во время или после загрузки... - person Jan R.; 05.06.2017