我正在使用MVC模型构建应用程序。 我使用延迟加载技术来填充变量。 (模型) 这个变量由一个UIViewController(Controller)
组成但是我不知道如何在模型操作完成时重新加载或触发视图控制器。这是我的代码
模型(延迟加载数据)
class func allQuotes() -> [IndexQuotes]
{
var quotes = [IndexQuotes]()
Alamofire.request(.GET, api_indexquotes).responseJSON { response in
if response.result.isSuccess && response.result.value != nil {
for i in (response.result.value as! [AnyObject]) {
let photo = IndexQuotes(dictionary: i as! NSDictionary)
quotes.append(photo)
}
}
}
return quotes
}
视图控制器的一部分
类索引:
UIViewController,UICollectionViewDelegate,UICollectionViewDataSource {
var quotes = IndexQuotes.allQuotes()
var collectionView:UICollectionView!
override func viewDidLoad() {
这是一个非常严肃的问题,我混淆了什么技术将用于完全满足我的目的?
答案 0 :(得分:1)
由于Alamofire
异步工作,因此需要完成块才能在收到数据后返回
class func allQuotes(completion: ([IndexQuotes]) -> Void)
{
var quotes = [IndexQuotes]()
Alamofire.request(.GET, api_indexquotes).responseJSON { response in
if response.result.isSuccess && response.result.value != nil {
for photoDict in (response.result.value as! [NSDictionary]) {
let photo = IndexQuotes(dictionary: photoDict)
quotes.append(photo)
}
}
completion(quotes)
}
}
或者有点" Swiftier"
... {
let allPhotos = response.result.value as! [NSDictionary]
quotes = allPhotos.map {IndexQuotes(dictionary: $0)}
}
我还建议使用原生的Swift集合类型,而不是NSArray
和NSDictionary
在视图控制器的viewDidLoad
中调用allQuotes
并在主线程的完成块中重新加载表视图。
以小写字母开头的indexQuotes
属性被假定为表视图的数据源数组
var indexQuotes = [IndexQuotes]()
override func viewDidLoad() {
super.viewDidLoad()
IndexQuotes.allQuotes { (quotes) in
self.indexQuotes = quotes
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
}
}
答案 1 :(得分:0)
这是异步操作,只需在此处使用回调:
class func allQuotes(callback: () -> Void) -> [IndexQuotes]
{
var quotes = [IndexQuotes]()
Alamofire.request(.GET, api_indexquotes).responseJSON { response in
if response.result.isSuccess && response.result.value != nil {
for i in (response.result.value as! [AnyObject]) {
let photo = IndexQuotes(dictionary: i as! NSDictionary)
quotes.append(photo)
}
}
callback()
}
return quotes
}
在你的UIViewController中:
var quotes = IndexQuotes.allQuotes() {
self.update()
}
var collectionView:UICollectionView!
override func viewDidLoad() {
update()
}
private func update() {
// Update collection view or whatever.
}
实际上,我强烈建议不要在这种情况下使用类函数(以及许多其他情况),它在一段时间后不可扩展且难以维护。
答案 2 :(得分:0)
首先从viewdidLoad中调用该函数。其次使用块或委托将控制权传递回ViewController。我更喜欢块approch。您可以拥有完成和故障块。在完成块中,您可以重新加载视图,如果失败,您可以使用alertcontroller或不执行任何操作。
您可以将AFNetworking视为块的示例。