このリンク先の解決に取り組んでいるのですが、リンク内容配列を並び替える方法を知りたいです。
alamofireで通信して帰ってくるjsonが下記のような感じなのですが、これがその下のソース内にあるforeachの中でjsonの並び順通りに配列して欲しいんですが、なぜかforeachの中でindex番号が順不同になるためバラバラに"banner"に入ってしまいます。
入ったものを最終的にjsonの並びに並び替えようと考えたのですが、
その方法が分かりません。
どういう考えができるでしょうか?
ご教示お願いいたします。
例)
jsonから10個取得できる。
それを順番に"banner"に入れたいがforeachのindexにより
[8,7,1,2,3,4,0,5,6,9]
このような並び順になってしまう。
それを最終的に
[0,1,2,3,4,5,6,7,8,9]
元のこの状態に直したい。
{ "list" : [ { "img_path" : "http://test1.png", "date" : "2018年06月10日", }, { "img_path" : "http://test2.png", "date" : "2018年06月11日", }, ・・・同じように続く。。。
Alamofire.request("http://testapi~.php",method: .post, parameters: param).responseJSON { response in guard let object = response.result.value else{ return } let jsons = JSON(object) jsons["list"].forEach { (index, img_path) in self.race_date_time.append(img_path["date"].string!) print("ここでのindexの値は:(index)")//結果:0,1,2,3,.....綺麗な順番 Alamofire.request(img_path["url"].string!).responseImage { response in debugPrint(response.result) if let image = response.result.value { print("image downloaded: (image)") print("ここでのindexの値は:(index)")//結果:3,0,1,2,.....バラバラな順番 let imgratio:CGFloat = (image.size.height)/(image.size.width) let iw = CGFloat(self.sw) let resize = image.ResizeÜIImage(width: iw, height: iw*imgratio) self.BannerImage.append(img_path["img_path"].string!) print("BannerImageは(self.BannerImage)") self.banner.append(resize!) } } }
リンク先の質問の私の回答は見ていないのでしょうか?
画像10個のURLがあったら、それぞれを並列処理(別スレッド)で画像を読み込みに行っていると思いますので、 「配列を並び替えたい」という発想自体が間違っていませんかね?
その発想しか思いつきませんでした。。
そもそも非同期処理と同期処理の違いは理解されていますでしょうか?
非同期処理は処理を止めずに並行して行えるからより早い処理になることは分かります。
言ってみれば別スレッドで画像をサーバーからDLして読み終わったら .responseImage {} のカッコ中がメインスレッドで実行される感じですよね。これで「バラバラな順番」になる理由は理解されたでしょうか? そこを理解した上で次のステップ(バラバラな順番の画像をどう組み立てるか)に行くべきかと思います。
分かりました。例えば、foreachでバラバラになるのは非同期なので仕方がないとして、そのindexと値をkey,valueで配列にセットで設置できれば、foreachが終わり全ての値がついた後で、key値を使いソートするということを考えたのですが、こう言ったことは可能な考えだと思われますか?
それは可能です。 1. indexと値をkey,valueで配列にセットするのはどう書くか 2. 全ての値がついた判定(すべての画像が読み込み終わったかの判定)はどう書くか 3. key値を使いソートはどう書くか それぞれをまずは考えて書いてみてください。
わかりました!ありがとうございます!
前の質問で「apiから取得される順番ごとに表示したい」と書いていませんでしたっけ?10個単位でいいんですか?
返答遅れて申し訳ありません。はい、apiから取得される順番で表示したいです。ただ、一度に取得できる数は10個ずつということです。その次の10個を取得するときはリクエスパラメータのscroolcountを一つ増やし要求することで取得できるようになっています。