调度组通知重新加载tableview

时间:2018-03-23 19:13:07

标签: ios swift grand-central-dispatch

我有一个在下拉tableview以重新加载时调用的函数。 在函数中,我需要在3个alamofire请求之后重新加载tableview,但它无法正常工作......

self.refreshControl.beginRefreshing()
if let URL = URL(string: "fetch1", relativeTo: Property.baseURL){
    fetchGroup.enter()
    let headers: HTTPHeaders = [
        "Authorization": Property.shared.token,
        "content-type": "application/json"
    ]

    Property.alamofireManager.request(URL, headers: headers).responseJSON{ response in
        //Manage json
        print("LEAVE 1")
        self.fetchGroup.leave()
    }
}

if let URL = URL(string: "fetch2", relativeTo: Property.baseURL){
    fetchGroup.enter()
    let headers: HTTPHeaders = [
        "Authorization": Property.shared.token,
        "content-type": "application/json"
    ]

    Property.alamofireManager.request(URL, headers: headers).responseJSON{ response in
        //Manage json
        print("LEAVE 2")
        self.fetchGroup.leave()
    }
}

if let URL = URL(string: "fetch3", relativeTo: Property.baseURL){
    fetchGroup.enter()
    let headers: HTTPHeaders = [
        "Authorization": Property.shared.token,
        "content-type": "application/json"
    ]

    Property.alamofireManager.request(URL, headers: headers).responseJSON{ response in
        //Manage json
        print("LEAVE 3")
        self.fetchGroup.leave()
    }
}

fetchGroup.notify(queue: .main, execute: {
    print("Going to Refresh")
    self.refreshControl.endRefreshing()
    self.tableView.reloadData()
})

基本上上面代码中发生的事情是某种程度上程序在通知中达到了self.tableview.reloadData(),并且它也没有打印出“Going to Refresh”。我想知道我是否从不同的功能重新加载tableview所以我试着评论self.tableView.reloadData(),但它是唯一重新加载tableview的地方。有没有人知道为什么代码没有按预期工作?

现在,它显示 “离开2” “离开3” 但它没有显示“LEAVE 1”。只需直接重新加载而无需等待“LEAVE 1”

3 个答案:

答案 0 :(得分:2)

首先,你必须有相同的进入和离开计数,并确保当你进入你离开派遣组。

let dispatchGroup = DispatchGroup()
dispatchGroup.enter()
custom_function_1 { dispatchGroup.leave() }

dispatchGroup.enter()
custom_function_2 { dispatchGroup.leave() }

dispatchGroup.notify(queue: .main) {
    print("Completed")
}

答案 1 :(得分:1)

您的代码执行的频率如何?我想像这样的情况:

  1. 用户滚动表。
  2. 您调用请求,多个'输入'正在调用电话。
  3. 用户再次滚动,在实际请求完成之前再次调用#2。
  4. 根据您处理此类案例的方式,用户可能会遇到奇怪的行为。

答案 2 :(得分:0)

对不起伙计们,它没有调用reload tableview。在编辑数据集时,tableview试图重用一个单元格,因为tableview反弹到下一个单元格。