【发布时间】:2016-04-29 02:35:48
【问题描述】:
我使用的 API 需要多次请求才能获得搜索结果。之所以这样设计,是因为搜索可能需要很长时间(> 5 分钟)。初始响应立即返回有关搜索的元数据,并且该元数据用于后续请求,直到搜索完成。我不控制 API。
- 第一个请求是对https://api.com/sessions/search/ 的 POST
- 对此请求的响应包含关于搜索的 cookie 和元数据。此响应中的重要字段是
search_cookie(字符串)和search_completed_pct(整数) - 第二个请求是对 https://api.com/sessions/results/ 的 POST,并在 URL 后附加了
search_cookie。例如https://api.com/sessions/results/c601eeb7872b7+0 - 对第二个请求的响应将包含:
- 查询完成后的搜索结果(又名
search_completed_pct== 100) - 关于搜索进度的元数据,
search_completed_pct是搜索进度,介于 0 到 100 之间。
- 查询完成后的搜索结果(又名
- 如果搜索未完成,我想每 5 秒发出一次请求,直到完成(又名
search_completed_pct== 100)
我在这里发现了许多类似的帖子,其中很多都使用调度组和 for 循环,但这种方法对我不起作用。我尝试了一个while循环,但变量范围存在问题。调度组也不适合我。这闻起来像是走错路了,但我不确定。
我正在寻找合适的设计来进行这些递归调用。我应该使用代表还是闭包+循环要走的路?我碰壁了,需要一些帮助。
下面的代码是我尝试过的大致思路(为清楚起见进行了编辑。没有 dispatch_groups()、错误处理、json 解析等)
Viewcontroller.swift
apiObj.sessionSearch(domain) { result in
Log.info!.message("result: \(result)")
})
ApiObj.swift
func sessionSearch(domain: String, sessionCompletion: (result: SearchResult) -> ()) {
// Make request to /search/ url
let task = session.dataTaskWithRequest(request) { data, response, error in
let searchCookie = parseCookieFromResponse(data!)
********* pseudo code **************
var progress: Int = 0
var results = SearchResults()
while (progress != 100) {
// Make requests to /results/ until search is complete
self.getResults(searchCookie) { searchResults in
progress = searchResults.search_pct_complete
if (searchResults == 100) {
completion(searchResults)
} else {
sleep(5 seconds)
} //if
} //self.getResults()
} //while
********* pseudo code ************
} //session.dataTaskWithRequest(
task.resume()
}
func getResults(cookie: String, completion: (searchResults: NSDictionary) -> ())
let request = buildRequest((domain), url: NSURL(string: ResultsUrl)!)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request) { data, response, error in
let theResults = getJSONFromData(data!)
completion(theResults)
}
task.resume()
}
【问题讨论】:
标签: swift