前提・実現したいこと
画像のURL情報が入った配列を、getThumnailsImage に渡し画像を取得したい。
発生している問題・エラーメッセージ
画像のURL情報が加えられた要素を、itemArrayにappendし終わる前に、
getThumnailsImage へ itemArray が渡されてしまい、その後の処理ができなくなってしまう。
解決方法がわかる方、ご教授お願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
回答2件
0
自己解決
DispatchGroupを利用し、解決することができました。
原因は、非同期処理を配列の個数分回していたにも関わらず、enter()を一度しか呼んでいなかったことです。なので、配列が回り終わる前に、後に行いたい処理が始まってしまっていました。
配列の個数分enter()を呼んだことで解決しました。
この方法が最適解ではないと思いますが、とりあえず意図した動きを見せたので、自己解決と致します。
投稿2019/10/16 12:23
総合スコア34
0
completion か GCD を利用するのがいいと思いますよ。
投稿2019/10/15 11:52
総合スコア1380
https://qiita.com/shtnkgm/items/d552bd3cf709266a9050
このページを参考にdispatchSemaphore と completion を使ってみたのですが、やはり、URLSessionの処理が終わる前にcompletionが呼ばれてしまい、上手く処理することができませんでした。
コード上に何か問題点があれば、教えていただきたいです。m(__)m
```
func getThumbnailsUrl (newsItemsArray: [NewsItems], completion: @escaping (_ thumbnails: [String]) -> () ) {
var thumbnailsArray: [String] = []
newsItemsArray.forEach { (newsItem) in
let releaseId: String? = newsItem.releaseID
let url: URL = URL(string: "https://coverartarchive.org/release/(releaseId!)/")!
let task = URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:Any]
let images = json!["images"] as? [[String:Any]]
let thumbnails = images?[0]["thumbnails"] as? [String:String]
var smallThumbnails:String = thumbnails!["small"]!
if let range = smallThumbnails.range(of: "http") {
smallThumbnails.replaceSubrange(range, with: "https")
newsItem.thumbnailsUrl = smallThumbnails
print(smallThumbnails)
thumbnailsArray.append(smallThumbnails)
}
} catch {
print("error")
}
})
task.resume()
}
completion(thumbnailsArray)
}
func getImage () ->[String] {
var result:[String]?
let semaphore = DispatchSemaphore(value: 0)
getThumbnailsUrl(newsItemsArray: newsItemArray) { (thumbnails) in
result = thumbnails
semaphore.signal()
}
semaphore.wait()
print("result(result?.count)")
return result!
}
```
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。

