【发布时间】:2017-04-01 03:14:04
【问题描述】:
我已经(几乎)成功实现了URLSessionDelegate、URLSessionTaskDelegate 和URLSessionDataDelegate,这样我就可以在后台上传我的对象了。但是我不确定如何实现完成处理程序,以便在服务器返回statuscode=200时删除我发送的对象@
我目前像这样启动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 的初始化中添加一个闭包,但 xcode 显示一个错误,这是不可能的。
我有我的自定义类 CustomDelegate:
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 和数据库。
【问题讨论】:
-
实现
didCompleteWithError。如果您想随时更新进度,可以使用didSendBodyData。 -
不相关,但不是实例化
NSURL和NSMutableURLRequest并转换为URL和URLRequest,您应该首先创建URL和URLRequest。唯一的技巧是,既然你想改变URLRequest,请使用var,而不是let。 -
@Rob 我已经做到了,但我的问题是如何“摆脱”
CustomDelegate类。例如,如果我在mainViewController中并且我调用了一个设置uploadTask的函数,那么我想更新 UI 例如 -
你给你的自定义委托类一些机制来通知主视图控制器。典型的方法是“完成处理程序”闭包或协议委托模式(即 1. 让您的自定义委托对象定义一个协议,它将通过该协议通知更新,2. 拥有自己的该类型的
delegate属性,3.让主视图控制器符合该协议,并且 4. 当您启动请求时,将视图控制器设置为“自定义委托对象”的委托)。或发布通知。 -
感谢@Rob 的回答。是否可以在后台上传任务中使用完成处理程序闭包?
标签: swift nsurlsessiondatatask nsurlsessionuploadtask