你能创建一个没有回调的方法来调用带回调的方法吗?

时间:2015-01-12 18:19:25

标签: swift

简而言之,我希望能够做到这一点

var tasks = API().getTasks();

我想将方法​​(例如' getTasks')称为

  1. 如果设置为OR
  2. 则返回一个值
  3. 进行API调用以获取值。
  4. 有没有办法通过编辑以下getTasks方法来做到这一点?

    现在我必须向方法发送一个块" API()。getTasks(){(tasks,error) - > ()in}"

    func getTasks(callback: (tasks: Dictionary<Int, Task>, error: String?) -> ()) {
        if (tasks.length != 0){
            callback(tasks);
        }else{
          self.httpGet("tasks", params : ""){
              (json, error) -> Void in
              if error != nil {
              } else {
                for task in json {
                    var t = Task(dict: task);
                    tasks.updateValue(t, forKey: t.id)
                }
            }
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                callback(tasks: tasks, error: error);
            })
        }
    }
    

    以下是我的httpGet方法,该方法使用API​​调用的JSON进行响应。

    func httpGet(method: String, callback : (Array<Dictionary<String, AnyObject>>, String?) -> Void) {
    
        var request = NSMutableURLRequest(URL: NSURL(string: "https://www.testing.com/"+method)!)
        let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {(data, response, error) -> Void in
            if error != nil {
                var nothing : Array<Dictionary<String, AnyObject>> = []
                callback(nothing, error.localizedDescription)
            } else {
                var result = NSString(data: data, encoding:NSASCIIStringEncoding)!
                var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: nil) as Array<Dictionary<String, AnyObject>>;
                callback(json, nil)
            }
        }
        task.resume()
    }
    

1 个答案:

答案 0 :(得分:1)

如果您不想将闭包传递给getTasks()getTasks()将如何知道在需要时调用哪个函数?

通常有两种方法:

  1. getTasks()是类的实例方法。您可以为接受闭包并保存它的类提供适当的init方法,并且在getTasks()中,您可以调用已保存的闭包
  2. getTasks()是类的实例方法,用于定义getTasks()调用的基本方法。您可以从此类继承并覆盖基本方法以自定义所执行的操作。
  3. 看来,虽然我不能在不查看更多代码的情况下确认,getTasks()是一个“类方法”。在这种情况下,您可以选择较少的自定义选项。我不建议使用此选项,但可能会有一些getTasks()可以检查的全局/类属性。
  4. 选项1通常是功能性程序员的首选; OOP程序员通常首选选项2。选项3不太受欢迎,但我看过这样的代码并且很难维护。你经常在像C这样的语言中看到它,但即使在C语言中,也有更好的方法可以解决这个问题。

    我也很好奇为什么你不喜欢你所问的方法 - 实际上,这是一种非常常见的方法,我认为它适用于大多数函数式编程模式。你不喜欢它吗?