TL;DR 版本:在 Swift 中,最接近NSInvocation
或类似打包方法调用(包括参数)的方法是什么?
背景:我有一个ServerController
对象在我的应用程序中用于向 API 发出请求。魔术发生在这种方法中:
private func makeRequestWithPath(
path: String,
method: String = "GET",
body: NSData? = nil,
successBlock: (AnyObject?) -> Void) {
// ...
self.urlSession.dataTaskWithRequest(request,
completionHandler: { (data, resp, error) -> Void in
if let httpResp = resp as? NSHTTPURLResponse {
switch httpResp.statusCode {
case 200:
successBlock(/* pass process response in here */)
case 401:
self.postNotificationOnMainThread(kAppTokenRefreshRequiredNotification)
// ...
}.resume()
API 请求会定期失败并返回 401,并在应用程序中作为通知进行广播,因为许多各方都对请求将花费更长的时间这一事实感兴趣。另一个 API 请求用于刷新应用令牌,然后其他 API 请求再次开始工作。
这是我需要帮助的部分:然后我需要在重新授权后重复原始 API 请求。
以前在 Objective-C 中,我可能使用一个NSInvocation
对象来打包原始方法调用,但这在 Swift 中不可用,因此我认为必须有一种更像 Swift 的方法。但是,我还没有设法弄清楚。
到目前为止,我想出的最佳方法是:
- 将参数以及对的引用放入字典中,并将它们作为参数
ServerController
传递到通知中object:
- 在通知观察者中(完成重新授权后),将参数拉出字典并再次手动调用相同的方法以重复请求
这似乎是一个次优的解决方案,必须有更好的方法。