什么是最好的方式来处理Alamofire在Swift中使用单独的类的TableView响应?

我正在写一个类来处理我的服务器请求返回JSON填充一个TableView。 这是我第一次做这种事情,我很好奇在这里使用什么是最好的范例。 比使用dispatch_async更像代表团吗? 几乎Alamofire的响应是asynchronous的,所以我不能从中返回数据。 由于我的请求发生在一个共享(它存在于我创build的框架中,所以我可以在多个目标中使用它)ServerManager类,我需要得到它的一些如何,我不知道什么是最好的方式去做。

与后台线程相比,委托的优点是什么?反之亦然。 我知道这个问题在这里可能会被问到很多,但是当我search时我似乎找不到一个好的解释。

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() } } } } 

闭包是可以分配给variables的函数。 Swift中的闭包相对简单。 这里是一个不带参数并具有void返回types的闭包。

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

在下面,variablesx的types签名是() -> Void ,并且被分配了闭包。 执行闭包只需要调用一个函数x()

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

闭包可以作为函数parameter passing。 当funcWithClosure()被调用时,它执行闭包。

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

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

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

types推断引擎允许你从闭包中删除types。

 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) }) 

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

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