前提・実現したいこと
必要な取りたい情報を取得するためにあるAPIを何回か叩く必要があり下ソースコードのようにループで回してパースして、最後のレスポンスのパースの処理が完了した時というコールバックを書きました。
途中で通信エラーになり、たまに値が全部取れない時があります。
最初Alamofireのクロージャの処理がメインスレッドで処理されることを知り、返ってきたレスポンスが全てメインスレッドで処理されるためダメなのかと思い、引数に別のキューを渡して下のコードで並列処理で書き直してみましたが、値が全部返ってくるときもあれば、まだ全部の値が返ってこない時がありました。
デッドロック or データの競合?なのでしょうか?
原因があまりわかっておりません。
解決策ご教示お願いしますm(_ _)m
該当のソースコード
Swift
1import SwiftyJSON 2import Alamofire 3import Alamofire_SwiftyJSON 4 5let group = DispatchGroup() 6let queue = DispatchQueue.global() 7 8 9 10var resultArray:[/*自作のクラス*/] = [] 11 ↓ 選択したもの分だけループ 12for index in 0..<selectArray.endIndex{ 13 14 var fareParameters = baseParameters 15 group.enter() 16 Alamofire.request(baseBusroutePatternFareURL, method: .get, parameters: fareParameters, encoding: URLEncoding.default) 17 .responseSwiftyJSON(queue: queue){ [weak self] dataResponse in 18 queue.async { 19 if dataResponse.error != nil { 20 group.leave() 21 return 22 } 23 else{ 24 if let result = dataResponse.value{ 25 26 //データがあれば入れる 27 if result.count != 0{ 28 //パースの処理 29 resultArray.append(/*パースしたものを入れる*/) 30 } 31 group.leave() 32 } 33 } 34 } 35 36 } 37 } 38 39 group.notify(queue: DispatchQueue.main){ 40 41 //callBack処理 42 callback(resultArray) 43 } 44 45 }
回答1件
あなたの回答
tips
プレビュー