在加载更多之前等待加载块

时间:2017-03-10 21:34:19

标签: ios swift alamofire

我正在构建一个应用程序,我需要以块的形式加载数据,我的意思是先加载5个项目,然后继续另外5个项目,但我无法弄清楚如何做到这一点。目前我把我的项目列表分块,所以我得到一个列表,每个列表中有5个项目。现在for-loop只是随着请求而消失,但我想等待响应,然后继续进行for循环。

我使用alamofire,我的代码看起来像这样。

private func requestItemsForField(items: [Item], completion: @escaping (_ measurements: Array<Measurement>?, _ success: Bool) -> ()) {
    let userPackageId = UserManager.instance.selectedUserPackage.id
    let params = ["userPackageId": userPackageId]

    for field in fields {
    let url = apiURL + "images/\(field.id)"

    let queue = DispatchQueue(label: "com.response-queue", qos: .utility, attributes: [.concurrent])
    Alamofire.request(url, method: .get, parameters: params, headers: headers()).responseArray(queue: queue, completionHandler: { (response: DataResponse<[Item]>) in

        if let items = response.result.value as [Item]? {
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: "itemsLoadedNotification"), object: nil)
            completion(items, true)
        }
        else {
            print("Request failed with error: \(response.result.error)")
            completion(nil, false)
        }
    })
    }
}

这是我列出我的名单的地方,并将其传递给上面。

 private func fetchAllMeasurements(completion: @escaping (_ measurements: [Item]?, _ done: Bool) -> ()) {
    let fieldSet = FieldStore.instance.data.keys
    var fieldKeys = [Item]()

    for field in fieldSet {
        fieldKeys.append(field)
    }

    // Create chunks of fields to load
    let fieldChunks = fieldKeys.chunkify(by: 5)

    var measurementsAll = [Measurement]()
    for fields in fieldChunks {
        requestItemsForField(fields: fields, completion: { (measurements, success) in
            if let currentMeasurement = measurements {
                measurementsAll.append(contentsOf: currentMeasurement)
            }
                completion(measurementsAll, true)
            }
        })
    }
}

3 个答案:

答案 0 :(得分:2)

您需要根据您的请求获得您将拥有的测量数量(例如服务器有34个测量值),然后编写类似

的代码
var serverMeasurementsCount = 1 //should be for first request

func requestData() {
    if self.measurements.count < self.serverMeasurementsCount {
        ...requestdata { data in
            self.serverMeasurementsCount = data["serverMeasurementsCount"]
            self.measurements.append(..yourData)
            self.requestData()
        }
    }

或致电requestData而不是completion handler或其他地方

编辑:修改代码(serverMeasurementsCount = 1

答案 1 :(得分:1)

而不是使用for循环,听起来你需要做var index = 0之类的事情,然后调用requestItemsForField()作为第一个参数发送fieldChunks[index]。然后在完成处理程序中,检查是否有另一个数组元素,如果是,再次调用requestItemsForField(),这次作为第一个参数发送fieldChunks[index+1]

答案 2 :(得分:0)

一种解决方案是创建一个新的递归函数来填充项,在isComplete中在闭包中添加一个新的Bool参数。然后在完成isComplete布尔值时调用该函数。要打破递归函数,添加itemsCountMax的全局静态变量,如果itemCountMax == itemsCount打破递归函数。