为什么completionHandler块没有响应?

时间:2016-03-29 07:07:27

标签: ios swift asynchronous alamofire completionhandler

我的任务是,通过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如果你能为我的任务提供更好的解决方案,那就太棒了!

2 个答案:

答案 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()
    }
}

}