2016-02-08 46 views
1

Qustion

我有以下結構實施Alamofire到DDD結構

類的UITableViewController(呈現) - >類內容(域) - >類的API(基礎設施)

內容類獲取的原始數據通過API類和表單內容,然後傳遞給UITableViewController。

我想用Alamofire做API類的網絡。

我已經看穿了stackoverflow,我只發現了UITableViewController直接訪問API類的例子。從表示層到基礎架構層的直接訪問是我們不應該做的事情。 像這樣 How to return value from Alamofire

我該如何實現將Alamofire實現爲DDD結構?

我想要實現這樣的事情

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

回答

0

您需要處理GET請求是RU n在後臺,而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() 
    } 
} 
+0

感謝輝煌的答案。我在TableView上做了一些不同的方式,但總體思路非常有幫助! – Bigair