URLSessionDelegate
, URLSessionTaskDelegate
및 URLSessionDataDelegate
을 성공적으로 구현하여 백그라운드에서 내 개체를 업로드 할 수 있습니다. 그러나 나는 내가 보낸 개체를 삭제할 수 있도록 나는 현재 내가 추가 노력이backgroundSession.uploadTask에 대한 완료 핸들러 구현
let configuration = URLSessionConfiguration.background(withIdentifier: "com.example.myObject\(myObject.id)")
let backgroundSession = URLSession(configuration: configuration,
delegate: CustomDelegate.sharedInstance,
delegateQueue: nil)
let url: NSURL = NSURL(string: "https://www.myurl.com")!
let urlRequest = NSMutableURLRequest(url: url as URL)
urlRequest.httpMethod = "POST"
urlRequest.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
let uploadTask = backgroundSession.uploadTask(with: urlRequest as URLRequest, fromFile: path)
uploadTask.resume()
같은 uploadTask
을 시작 statuscode=200
서버가 반환 할 때, 완료 핸들러를 구현하는 방법을 잘 모르겠어요 종료로 uploadTask
의 초기화가 완료되었지만 xcode가 불가능하다는 오류가 표시되었습니다. 또한 대의원의 다른 기능을 구현
class CustomDelegate : NSObject, URLSessionDelegate, URLSessionTaskDelegate, URLSessionDataDelegate {
static var sharedInstance = CustomDelegate()
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
print("\(session.configuration.identifier!) received data: \(data)")
do {
let parsedData = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:Any]
let status = parsedData["status"] as! NSDictionary
let statusCode = status["httpCode"] as! Int
switch statusCode {
case 200:
// Do something
case 400:
// Do something
case 401:
// Do something
case 403:
// Do something
default:
// Do something
}
}
catch {
print("Error parsing response")
}
}
}
:
나는 내 사용자 정의 클래스 CustomDelegate 있습니다.
내가 원했던 것은 업로드가 완료되어서 내가 느낀 UI와 데이터베이스를 CustomDelegate
에서 어렵게 (어쩌면 불가능합니까?) 업데이트 할 수 있다는 것을 어떻게 든 알고 있다는 것입니다.
class CustomDelegate : NSObject, URLSessionDelegate, URLSessionTaskDelegate, URLSessionDataDelegate {
static var sharedInstance = CustomDelegate()
var uploadDidFinish: ((URLSessionTask, Error?) -> Void)?
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
DispatchQueue.main.async {
uploadDidFinish?(task, error)
}
}
}
이 그런 다음 뷰 컨트롤러는, 예를 들어, 요청을 시작하기 전에이 폐쇄을 설정합니다 :
구현 ['didCompleteWithError'] (https://developer.apple.com/reference/foundation/urlsessiontaskdelegate/1411610-urlsession). 진행 상황에 따라 진행 상황을 업데이트하려면 ['didSendBodyData'] (https://developer.apple.com/reference/foundation/urlsessiontaskdelegate/1408299-urlsession)를 사용할 수 있습니다. – Rob
'NSURL'과'NSMutableURLRequest'를 인스턴스화하지 않고'URL'과'URLRequest'로 형변환하는 대신에, 먼저 URL과 URLRequest를 만들어야합니다. 유일한 트릭은'URLRequest'를 변형시키고 싶기 때문에'let'이 아닌'var'을 사용하는 것입니다. – Rob
@Rob 나는 그것을했지만 내 문제는 어떻게 "CustomDelegate"클래스에서 빠져 나올 수 있는가이다. 예를 들어'mainViewController'에서 예를 들어'uploadTask'의 설정을하는 함수를 호출하면 UI를 업데이트하고 싶습니다. 예를 들어 – Frederik