【问题标题】:Implement Alamofire into DDD structure在 DDD 结构中实现 Alamofire
【发布时间】:2016-05-17 16:59:16
【问题描述】:

问题

我有以下结构

类 UITableViewController (Presentation) -> 类 Contents(Domain) -> 类 API(Infrastructure)

Contents 类通过 API 类获取原始数据并形成内容,然后传递给 UITableViewController。

我想在 API 类中使用 Alamofire 做 Networking。

我查看了stackoverflow,只找到了UITableViewController直接访问API类的例子。从表示层直接访问基础设施层是我们不应该做的事情。 像这样 How to return value from Alamofire

如何在 DDD 结构中实现 Alamofire?

我想实现这样的目标

UITableViewController

class MyTableViewController: UITableViewController {

var contents: Contents?

override func viewDidLoad() {
    super.viewDidLoad()

    let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
    dispatch_async(dispatch_get_global_queue(priority, 0)) {
        // do some task
        self.contents = Contents.get("MyContents")
        self.tableView.reloadData()

    }
}
}

内容

class Contents: NSObject {

static func get(contentsName: String) -> Contents {
    let data = MyAPI.getRequest("https://xxxx.com/myContents")

    // Form contents
    let contents = ContentsFactory(data)

    return contents
}
}

API

class MyAPI: NSObject {

static getRequest(url) -> NSData {
    // Get and return data using alamofire
}
}

【问题讨论】:

    标签: swift networking alamofire


    【解决方案1】:

    你需要处理后台运行的get请求,而Contents的实例会立即返回。在 Alamofire 请求的完成处理程序中,您将需要它回调到 Contents 实例,然后该实例将回调到 ViewController

    因此,您的 Contents 类需要在 get 函数上传递一个完成闭包,如下所示:

    static func get(contentsName: String, completion: (() -> Void)?) -> Contents {
    

    这个闭包必须传递给 API(或通过其他技术),因此最终可以在 Alamofire 请求完成时调用它。此外,与其让类方法完成所有后台工作,不如在您创建的Contents 实例中处理。

    然后你会调用使用:

    self.contents = Contents.get("MyContents", completion({
        dispatch_async(dispatch_get_global_queue(priority, 0)) {
            self.tableView.reloadData()
        }
    }
    

    【讨论】:

    • 感谢您的精彩回答。我在 TableView 上做了一些不同的方法,但总体思路非常有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2011-01-20
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    相关资源
    最近更新 更多