我正在為 HackerNews 構建一個簡單的 iOS 客戶端。我正在使用他們的 API,據此我將能夠獲取已排序的帖子 ID(按新、最佳和頂部排序)以及將 ID 傳遞給請求的單個帖子專案。我面臨的問題如下:一旦我獲得了 IDs 陣列,如何以有序的方式對每個帖子進行 HTTP 呼叫?以我目前實作它的方式,我沒有任何運氣。例如說 IDs 陣列是 [3001, 3002, 3003, 3004]。我嘗試呼叫該方法以在 for 回圈中獲取這些帖子,發出調度組和調度信號量,但我仍然讓它們無序,例如對專案 3003 的呼叫在 3002 之前完成,依此類推。
我正在使用的方法:
@Published var posts: [Post] = []
func getPosts(feedType: FeedType){
posts = []
self.getFeedIDs(feedType: feedType).subscribe{ ids in
let firstFifteen = ids[0...15]
let dGroup = DispatchGroup()
let dQueue = DispatchQueue(label: "network-queue")
let dSemaphore = DispatchSemaphore(value: 0)
dQueue.async {
for id in firstFifteen{
dGroup.enter()
self.getPost(id: id).subscribe{ post in
self.posts.append(post)
dSemaphore.signal()
dGroup.leave()
}
dSemaphore.wait()
}
}
}
}
func getFeedIDs(feedType: FeedType) -> Observable<[Int]> {
return self.execute(url: URL(string: "https://hacker-news.firebaseio.com/v0/\(feedType)stories.json")!)
}
func getPost(id: Int) -> Observable<Post>{
return self.execute(url: URL(string: "https://hacker-news.firebaseio.com/v0/item/\(id).json")!)
}
func execute <T: Decodable>(url: URL) -> Observable<T> {
return Observable.create { observer -> Disposable in
let task = URLSession.shared.dataTask(with: url) { res, _, _ in
guard let data = res, let decoded = try? JSONDecoder().decode(T.self, from: data) else {
return
}
observer.onNext(decoded)
observer.onCompleted()
}
task.resume()
return Disposables.create {
task.cancel()
}
}
}
任何幫助將不勝感激。
uj5u.com熱心網友回復:
信號量毫無意義,而且效率低下。
使用 Apple 建議與 TaskGroups 結合使用的相同模式:在字典中收集資料,并在收到通知后按字典鍵對資料進行排序
func getPosts(feedType: FeedType){
var postData = [Int:Post]()
posts = []
self.getFeedIDs(feedType: feedType).subscribe{ ids in
let firstFifteen = ids[0...15]
let dGroup = DispatchGroup()
for (index, element) in firstFifteen.enumerated() {
dGroup.enter()
self.getPost(id: element).subscribe{ post in
postData[index] = post
dGroup.leave()
}
}
dGroup.notify(queue: .main) {
for key in postData.keys.sorted() {
posts.append(postData[key]!)
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/512294.html
標籤:迅速apihttp迅捷
