我的任务是,通过Alamofire加载JSON,填充我的数组,稍后在func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
内显示它但是我有一个问题,因为那些块在我的数组填满之前启动,所以我遇到了崩溃,我的数组是空的。
我认为我可以使用completionHandler解决这个问题:
func abcd(completion: (() -> Void)) {
let getMyProfileURL = "\(self.property.host)\(self.property.getMyProfile)"
Alamofire.request(.POST, getMyProfileURL, parameters: self.userParameters.profileParameteres, encoding: .JSON).responseJSON { response in
do {
let json = JSON(data: response.data!)
if json["user"].count > 0 {
self.profileDetails.append(ProfileDetailsModel(json: json["user"]))
}
}
}
}
稍后,我称之为:
func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
self.abcd {
print("SUCCESS")
print(self.profileDetails)
}
}
但它不会打印我的completionHandler
代码prints
。为什么?有什么问题,我该如何解决?
P.S如果你能为我的任务提供更好的解决方案,那就太棒了!
答案 0 :(得分:1)
完成异步数据请求后,在主线程中重新加载CollectionView。
func abcd(completion: (() -> Void)) {
let getMyProfileURL = "\(self.property.host)\(self.property.getMyProfile)"
Alamofire.request(.POST, getMyProfileURL, parameters: self.userParameters.profileParameteres, encoding: .JSON).responseJSON { response in
do {
let json = JSON(data: response.data!)
if json["user"].count > 0 {
self.profileDetails.append(ProfileDetailsModel(json: json["user"]))
dispatch_async(dispatch_get_main_queue()) {
collectionView.reloadData()
}
}
}
}
}
答案 1 :(得分:1)
回应'为什么它不打印completionHandler代码':因为你从未在abcd
中调用完成处理程序。正确的代码是:
func abcd(completion: (() -> Void)) {
let getMyProfileURL = "\(self.property.host)\(self.property.getMyProfile)"
Alamofire.request(.POST, getMyProfileURL, parameters: self.userParameters.profileParameteres, encoding: .JSON).responseJSON { response in
do {
let json = JSON(data: response.data!)
if json["user"].count > 0 {
self.profileDetails.append(ProfileDetailsModel(json: json["user"]))
}
completion()
}
}
}