面向协议的文件获取

时间:2016-09-25 15:17:51

标签: ios swift architecture swift-protocols protocol-oriented

最近我看了这个演讲(link,参见 Networking 部分),我决定在面向协议的编程方面做一些特殊工作。所以我想到了这个简单的例子:View Controller用于显示文件列表。当然,面向协议的方式,具有以下约束:

FilesViewController - 包含表格视图& FilesTableViewAdapter。表视图委托。 FilesTableViewAdapter - 可使用表格视图& FilesProvider: Gettable, 所以在测试中我可以注入FilesProviderMock: GettableFilesTableViewAdapter是表格视图的数据源,使用FilesProvider来获取文件。

final class FilesTableViewController: UIViewController {

    var filesTableView: FilesTableView! { return view as! FilesTableView }

    private var tableViewAdapter: FilesTableViewAdapter<FilesProvider>!

    // MARK: Subclassing

    override func loadView() {
        view = FilesTableView(frame: UIScreen.main.bounds)
    }

    override func viewDidLoad() {
       tableViewAdapter = FilesTableViewAdapter(filesTableView.tableView, provider: FilesProvider())

       // Actually I would like to have this method in Adapter
       // so that VC isn't handling networking.
       tableViewAdapter.provider.get { result in
           // result type: (Result<[File]>)
           switch result {
           case .success(let files): print(files)
           case .failure(let error): print(error)
           }
        }

        filesTableView.tableView.delegate = self
        filesTableView.tableView.dataSource = tableViewAdapter
     }
}

extension FilesTableViewController: UITableViewDelegate {
  //
}


final class FilesTableViewAdapter<T: Gettable>: NSObject, UITableViewDataSource {

    let provider: T
    private let tableView: UITableView

    init(_ tableView: UITableView, provider: T) {
        self.tableView = tableView
        self.provider = provider

        super.init()
    }

    func problem() {
        provider.get { result in
            // Result type is (Result<T.T>) - :(
            switch result {
            case .success(let files): print(files)
            case .failure(let error): print(error)
        }
    }
}

struct FilesProvider {
   private let Files = [File]()
}

extension FilesProvider: Gettable {

    func get(completionHandler: (Result<[File]>) -> Void) {
        //
    }
}

protocol Gettable {
   associatedtype T
   func get(completionHandler: (Result<T>) -> Void)
}

我知道我用概括这段代码走得太远了。现在我被困了,我有这个问题,我无法自己回答:

  1. 如何以面向协议的方式使用,类中的网络代码与VC不同(比如 Adapter )?
  2. 如何在将来轻松测试和扩展它?

0 个答案:

没有答案