使用单独的类处理Alightofire对Swift中的TableView响应的最佳方法是什么?

时间:2015-12-31 15:06:36

标签: ios swift uitableview alamofire

我正在编写一个类来处理我的服务器请求,这些请求返回JSON以填充TableView。这是我第一次做这种事情,我很好奇这里使用的最佳范例是什么。类似委托更像是使用dispatch_async吗?几乎Alamofire的响应是异步的,所以我无法从中返回数据。由于我的请求发生在一个共享(它存在于我创建的框架中,所以我可以在多个目标中使用它)的ServerManager类中,我需要将它带到TableView一些如何,而且我不确定什么是最好的这样做的方法。

委托对背景线程有什么好处,反之亦然?我知道这个问题可能会在这里被问到很多,但我在搜索时似乎无法找到一个好的解释。

1 个答案:

答案 0 :(得分:4)

ServerManager中的方法应该传递一个闭包(块)。这在视图控制器中不需要委托也不需要调度。

class ServerManager {
    func fetchObjectsWithOptions(options: [AnyObject], completion: (items: [AnyObject], error: ErrorType?) -> Void) {
        // Use the options to setup and make the request
        // Be sure it executes on the main thread
        completion(items: items, error: nil)
        // Any finishing needed
    }
}

// ...

class MyTableViewController: UITableViewController {

    lazy var serverManager = ServerManager()
    var items: [AnyObject] = []

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        serverManager.fetchObjectsWithOptions([]) {
            items, error in

            if error == nil {
                self.items = items
                self.tableView.reloadData()
            }
        }
    }

}

闭包是可以分配给变量的函数。在Swift中,闭包相对简单。这是一个不带参数且具有void返回类型的闭包。

{ () -> Void in print("foo") }

下面,变量x的类型签名为() -> Void,并为其分配了闭包。执行闭包只需要调用函数x()

let x: () -> Void = { () -> Void in print("foo") }
x() // prints foo

闭包可以作为函数参数传递。调用funcWithClosure()时,它会执行闭包。

func funcWithClosure(x: () -> Void) {
    x()
}

funcWithClosure({ () -> Void in print("foo") })

带参数的闭包具有作为闭包类型的一部分指定的参数及其类型。

func funcWithClosure2(x: (string: String) -> Void) {
    x(string: "foo") // <-- parameters must be named
}

funcWithClosure2({ (string: String) -> Void in print(string) })

类型推理引擎允许您从闭包中删除类型。

funcWithClosure({ print("foo") }) // <-- No type declaration
funcWithClosure2({ string in print(string) }) // <-- Only parameter name

此外,如果闭包是最后一个参数,则不需要闭包周围的括号。

funcWithClosure { print("foo") }

最后,这是一个多个参数以闭包结束的示例。

func funcWithString(string: String, closure: (string: String) -> Void) {
    closure(string: string)
}

funcWithString("foo", closure: { (string: String) -> Void in print(string) })

或者,您可以使用较不详细的语法。

funcWithString("foo") { string in print(string) }