質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

1718閲覧

swiftで配列の中身が空になる

muraramu

総合スコア12

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/06/24 01:01

前提・実現したいこと

最近最近swiftを始め、映画の公開日リストを出すアプリを製作しています。 apiで映画の公開日などを持ってきて、配列に格納し、別の.swiftに配列を共有したいのですが、デバッグ2でprintしてる時点では配列にデータがしっかり入っているのですが、デバッグ1だと配列の中身が空になってしまいます。 色々調べたのですが原因不明でして、何か解決策などあればご教授お願いいたします。

発生している問題・エラーメッセージ

エラーメッセージなし 配列の中身が空です。

該当のソースコード

ViewControllerswift

1import UIKit 2 3class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 4 5 //ページ数管理用変数 6 static var count:Int = 1 7 //映画のタイトルリスト(String) 8 static var movieTitleList :[String] = [] 9 //映画の公開日リスト(Int) 10 static var movieReleaseDateList :[Int] = [] 11 //映画のポスターの画像のパスリスト 12 static var moviePosterPathList :[String] = [] 13 14 //ソート用変数 15 static var j: Int = 0 16 static var t: Int = 0 17 static var k: String = "" 18 static var l: String = "" 19 20 @IBOutlet weak var tableView: UITableView! 21 22 // セマフォ 23 //static var semaphore = DispatchSemaphore(value: 24) 24 25 override func viewDidLoad() { 26 super.viewDidLoad() 27 28 //let today = Date(format:"yyyy-MM-dd") 29 //print("(today)") 30 31 //ViewController.semaphore = DispatchSemaphore(value: 24) 32 //情報を読み込む 33 for forCount in stride(from: 0, to: 25, by: 1) { 34 ViewController.searchMovie(count: forCount) 35 } 36 37 //デバッグ1 38 print("タイトル:(ViewController.movieTitleList) 総数:(ViewController.movieTitleList.count)") 39 print("公開日:(ViewController.movieReleaseDateList) 総数:(ViewController.movieReleaseDateList.count)") 40 print("ポスター:(ViewController.moviePosterPathList) 総数:(ViewController.moviePosterPathList.count)") 41 42 //ViewController.semaphore.wait(timeout: DispatchTime.distantFuture) 43 44 //カスタムしたtableViewCellを呼び出す 45 self.tableView.register(UINib(nibName: "customCellClass", bundle: nil), forCellReuseIdentifier: "tableViewCell") 46 navigationController?.navigationBar.prefersLargeTitles = true 47 createTable() 48 } 49 50 //JSONのitem内のデータの構造 51 struct ItemJson: Codable { 52 //映画のタイトル 53 let original_title: String? 54 //リリース日 55 let release_date: String? 56 //ポスターの画像のパス 57 let poster_path: String? 58 } 59 //JSONのデータ構造 60 struct ResultJson: Codable { 61 //複数要素 62 var results:[ItemJson]? 63 } 64 65 //映画のリスト格納 66 static func searchMovie(count : Int) { 67 //リクエストURLの組み立て 68 guard let req_url = URL(string: "https://api.themoviedb.org/3/movie/upcoming?page=(count)&language=ja-JP&api_key=45cfffebd76a148b4c8907aed12b6eae") else { 69 return 70 } 71 //リクエストに必要な情報を生成 72 let req = URLRequest(url: req_url) 73 74 //リクエストをタスクとして登録 75 let task = URLSession.shared.dataTask(with: req, completionHandler: { 76 (data , response , error) in 77 do { 78 //JSON Decoderのインスタンス取得 79 let decoder = JSONDecoder() 80 //受け取ったJSONデータを解析して格納 81 let json = try decoder.decode(ResultJson.self , from: data!) 82 //print(json) 83 //映画の情報が取得できているか確認 84 if let resultList = json.results { 85 //取得している映画の情報の数だけ処理する 86 for results in resultList { 87 //映画のタイトル、公開日、ポスターのデータがあるか確認 88 if let original_title = results.original_title , var release_date = results.release_date , var 89 poster_path = results.poster_path { 90 91 //公開日の”-”の文字が邪魔なので削除 92 if let range = release_date.range(of:"-") { 93 release_date.removeSubrange(range) 94 if let range = release_date.range(of:"-") { 95 release_date.removeSubrange(range) 96 } 97 } 98 //画像ファイルの”/”が邪魔なので削除 99 if let range = poster_path.range(of:"/") { 100 poster_path.removeSubrange(range) 101 } 102 103 //それぞれの配列に入れる 104 movieTitleList.append(original_title) 105 moviePosterPathList.append(poster_path) 106 //公開日は後でソートしたいのでInt型に変換する 107 movieReleaseDateList.append(Int(release_date)!) 108 //公開日に合わせてタイトル、ポスターの画像を降順にソート 109 for _ in 0..<movieReleaseDateList.count-1 { 110 for j in 0..<movieReleaseDateList.count-1 { 111 if(movieReleaseDateList[j] > movieReleaseDateList[j+1]){ 112 t = movieReleaseDateList[j] 113 movieReleaseDateList[j] = movieReleaseDateList[j+1] 114 movieReleaseDateList[j+1] = t 115 116 k = movieTitleList[j] 117 movieTitleList[j] = movieTitleList[j+1] 118 movieTitleList[j+1] = k 119 120 l = moviePosterPathList[j] 121 moviePosterPathList[j] = moviePosterPathList[j+1] 122 moviePosterPathList[j+1] = l 123 } 124 } 125 } 126 } 127 } 128 //デバッグ2 129 print("タイトル:(ViewController.movieTitleList) 総数:(ViewController.movieTitleList.count)") 130 print("公開日:(ViewController.movieReleaseDateList) 総数:(ViewController.movieReleaseDateList.count)") 131 print("ポスター:(ViewController.moviePosterPathList) 総数:(ViewController.moviePosterPathList.count)") 132 ViewController.count+=1 133 134 //semaphore.signal() 135 } 136 } catch { 137 print("エラー発生") 138 } 139 }) 140 //ダウンロード開始 141 task.resume() 142 } 143 144 override func didReceiveMemoryWarning() { 145 super.didReceiveMemoryWarning() 146 // Dispose of any resources that can be recreated. 147 } 148// 一つのセクションに何個のセルが入るのか 149 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 150 return 3 151 } 152// レイアウトをカスタマイズしたcustomCellClassをtable view cellに適応している 153 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 154 let cell = tableView.dequeueReusableCell(withIdentifier: "tableViewCell", for: indexPath) as! customCellClass 155 cell.cellDisplayControl(indexPath: indexPath) 156 return cell 157 } 158// セクションの数をを決める 159 func numberOfSections(in tableView: UITableView) -> Int { 160 return 2 161 } 162// セクションのタイトル表示 163 func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 164 return "セクション(section)" 165 } 166// セクションの高さを決める 167 func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 168 return 50 169 } 170// tableViewの設定 171 func createTable () { 172 tableView.delegate = self 173 self.tableView.dataSource = self 174 tableView.rowHeight = 430 175 tableView.sectionHeaderHeight = 30 176 } 177} 178

CustomCellClassswift

1import UIKit 2 3class customCellClass: UITableViewCell { 4 5 @IBOutlet weak var cellUIimageView: UIImageView! 6 @IBOutlet weak var cellLabel: UILabel! 7 8 func cellDisplayControl(indexPath: IndexPath){ 9 self.cellLabel.text = ViewController.movieTitleList[0] 10 self.cellUIimageView.image = UIImage(named: ViewController.moviePosterList[0]) 11 } 12}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2019/06/25 00:22

処理の流れは下記のようになっていると思いますが、把握出来てますか? 読み込み開始 → デバッグ1 → 読み込み完了 → デバッグ2
guest

回答1

0

URLSession.shared.dataTaskは非同期と呼ばれるたぐいの処理でして、
DL自体は別スレッドで動作し、メインスレッドと並行して行われます。
DLが終わった時点でcompletionHandlerで指定したクロージャが(たしか別スレッドのまま)実行されます。

マルチスレッドの基礎を勉強をされたほうが良いと思われます。
また、ソートはソート関数を使ったほうが良いです。

投稿2019/06/27 04:54

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問