gpt4 book ai didi

swift - PromsieKit + Alamofire 用于加载分页 HTTP 数据

转载 作者:行者123 更新时间:2023-11-28 12:44:47 24 4
gpt4 key购买 nike

我正在将一些代码从 RestKit 迁移到 Alamofire。我使用 MagicalRecord + AlamofireObjectMapper 将 JSON 映射到 CoreData 对象。

我现在面临以下情况:

我的数据位于此 URL:

http://domain.com/api/resources?start=XX&limit=YY

现在我必须这样做:

  • 使用 50 的页面大小从给定的 URL 下载数据的第一页
  • 如果加载对象的数量等于页面大小,则将 start 参数增加页面大小
  • 如果数量小于页面大小,合并所有加载的对象并将它们返回给被调用者。

在我之前的非 Alamofire 示例中,我确实为此使用了递归,但是对于 PromiseKit,我想我必须对 Promise 进行额外的链接,而不是方法调用的递归。

到目前为止,我只完成了 Promises 的简单链接,因此条件循环链接以及如何使用 PromiseKit 实现它对我来说有点神秘。

最佳答案

我确实想出了一个似乎工作正常的方法。但是,我觉得这可能会更简洁,因此非常欢迎更好的答案或评论。

我决定结合递归和 Promises(由于缺乏更好的解决方案)。因此,我传递了一个 currentPromise,随着需要加载更多页面,它被进一步链接。

第一个方法简单地启动整个过程,创建的 Promise 立即用一个空数组实现,如下所示:Promise([Issue]()):

func loadAllPagedIssues(repository: Repository) -> Promise<[Issue]>{
return loadPagedIssues(repository, limit: Config.apiPageSize, start: 0, currentPromise: Promise([Issue]()))
}

下一个方法执行下载内容并解析它的实际工作。

func loadIssues(url: String, repository: Repository) -> Promise<[Issue]>{
return Promise{ fullfill, reject in

self.manager
.request(.GET, url, headers: self.headers)
.responseArray(keyPath: "issues", context: repository) { (response: Response<[Issue], NSError>) in
switch response.result{
case .Success(let value):
fullfill(value)
case .Failure(let e):
reject(e)
}
}
}
}

final 方法结合了传入的结果和当前加载的结果。如果到达页面末尾,则使用 fullfilled promise 返回结果,如果需要加载更多页面,则发出对第二个方法的另一个调用:

func loadPagedIssues(repository: Repository, limit: Int, start: Int, currentPromise: Promise<[Issue]>) -> Promise<[Issue]>{

let url = baseURL + Config.pagedIssuesPath.replaceTokens(
[
"repo": repository.slug,
"limit": String(limit),
"start": String(start)
]
)

let loadPromise = self.loadIssues(url, repository: repository)
return when(loadPromise, currentPromise).then{ newIssues, existingIssues -> Promise<[Issue]> in

let combined = Promise<[Issue]>(newIssues + existingIssues)
if newIssues.count < limit{
// Reached the end of the page
return combined
} else {
return self.loadPagedIssues(repository, limit: limit, start: (start + limit), currentPromise: combined)
}
}
}

关于swift - PromsieKit + Alamofire 用于加载分页 HTTP 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38404047/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com