使用协议进行异步响应

时间:2016-04-21 05:34:49

标签: ios swift asynchronous delegates protocols

我在Helper类中有一个post请求,在收到响应时,我想设置一个委托和一个在我的ViewController上运行的函数。但是,由于这是一项异步任务,如果它肯定会成功的话,我会感到怀疑。

我尝试设置协议并委托但是我无法在Helper和ViewController之间设置正确的协议

我的VC:

class MyTableViewController: UITableViewController, HelperDelegate {

viewDidLoad() {
    let myHelper = Helpers()
    myHelper.HelpersSettingsDelegate = self
}
func update(newUrl: String {
     // save string to db
}

我的助手:

protocol HelperDelegate : UITableViewController {
    func update(newUrl: String)
}

class Helpers: NSObject {

var HelpersSettingsDelegate : HelperDelegate?


...
 case .Success(let upload, _, _):
        upload.responseJSON { response in
            print("SUCCESS")
            debugPrint(response)
            let new = response.result.value!["success"]

            if let delegate = self.HelperSettingsDelegate {
                 delegate.update(new)
            }

         }
  self.HelperSettingsDelegate类型'助手'上的

错误没有会员' HelpersSettingsDelegate

所以我的问题是

  • 为什么我的协议不起作用?

  • 使用这种方法是否安全,或者某些数据在响应时间之间丢失(如果用户在运行委托方法之前离开页面)?

修改:如果我尝试使用protocol HelperDelegate { },则会强制我使用HelperSettingsDelegate.updateUploadedImageString(Self)

1 个答案:

答案 0 :(得分:1)

所以,你想拥有一个可重复使用的组件" Helpers"实现异步函数,是否希望从表视图控制器中调用函数UITableViewController的任何update(_:)中使用它?

恕我直言,最好的方法不需要代表的代表和协议。就是这样:

class Helper {
    func fetchDataAsync(completion: (result: AnyObject?, error: ErrorType?) -> () {
        ...
    }
}

然后,在表视图控制器中,在任何使用帮助器类的函数中,例如在viewDidLoad中:

override func viewDidLoad() {
    super.viewDidLoad()
    let helper = Helper(params)
    helper.fetchDataAsync { (data, error) in
        if let data = data {
            let url = ...
            self.update(url)
        }
        // handle error
    }
}