質問失礼します。
アプリ内の複数箇所で同じAPIを使用する為、API検索用の値を引数にして
取得した値をエンティティクラスとして返すclass funcをUtilクラスに作成したいです。
下記の様にコードを記載して挙動を確認したのですが、
APIから情報を取得するクロージャーの中身がいつ発動されるか分からず、
値が必要な画面遷移前までに値を取得出来ずにいます。
(現状では画面遷移前のprintの後にクロージャー内のprintが表示される為、順序が逆になってしまいます)
これはどの様にコードを修正すれば解消する事ができるのでしょうか。
どなたかご教授いただけますと嬉しいです。
よろしくお願い致します。
コントローラークラス
Swift
1//写真を撮影した後 2 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 3 //インスタンスを用意しておく 4 var dataList = DataList() 5 6 if let pickedImage = info[.editedImage] as? UIImage { 7 8 //イメージをbase64にエンコードする 9 let imageData = pickedImage.pngData()! as NSData 10 let imageString = imageData.base64EncodedString(options: .lineLength64Characters) 11 12 //imageStringを引数として渡して、DataList型として値を受け取りたい 13 dataList = Util.returnData(image:imageString) 14 15 } 16 print(dataList.data1)←値が空欄になってしまう 17 18 //画面遷移する 19 picker.dismiss(animated: true, completion: nil) 20 } 21}
エンティティクラス
Swift
1class DataList { 2 3 var data1 = "" 4 var data2 = "" 5 var data3 = "" 6 7//値を設定する時だけ引数を渡してインスタンスを生成したい 8 init(data1:String, data2:String, data3:String){ 9 10 self. data1 = data1 11 self. data2 = data2 12 self. data3 = data3 13 } 14 15//インスタンスの準備用 16 init(){ 17 } 18}
Utilクラス
Swift
1class Util{ 2 3 class func returnData(image:String) -> DataList { 4 //インスタンスを用意しておく 5 var dataList = DataList() 6 7 //JSONデータを取得する 8 session.dataTask(with: request) { (data, response, error) in 9 if error == nil, let data = data, let response = response { 10 11 let jsonData = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String: [String:Any]] 12 13 if let data = jsonData?["hits"] { 14 15 let data1 = data["data1"] as! String 16 let data2 = data["data2"] as! String 17 let data3 = data["data3"] as! String 18 //取得した値を格納する 19 dataList = DataList(data1,data2,data3) 20 21 print(dataList.data1)←ここでは値を正常に取得出来る 22 } 23 } else { 24 // API通信失敗 25 print(error as Any) 26 } 27 }.resume() 28 29print(dataList.data1)←ここでは値が空になってしまう 30 31 return dataList 32 } 33}
*コントローラークラスのAPIメソッド呼び出し箇所を修正*
Swift
1//写真を撮影した後 2 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 3 4 if let pickedImage = info[.editedImage] as? UIImage { 5 6 //イメージをbase64にエンコードする 7 let imageData = pickedImage.pngData()! as NSData 8 let imageString = imageData.base64EncodedString(options: .lineLength64Characters) 9 10 var dataList = Util.returnData(image:imageString, completion: { 11 result in 12 print(result.data1)←値が表示されない 13 //商品リストへ遷移する 14 picker.dismiss(animated: true, completion: nil)←画面遷移しない 15 }) 16}
*UtilクラスのAPI呼び出し箇所の修正*
Swift
1class Util{ 2 3 class func returnData(image:String), completion: @escaping (DataList) -> Void) { 4 //インスタンスを用意しておく 5 var dataList = DataList() 6 7 //JSONデータを取得する 8 session.dataTask(with: request) { (data, response, error) in 9 if error == nil, let data = data, let response = response { 10 11 let jsonData = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String: [String:Any]] 12 13 if let data = jsonData?["hits"] { 14 15 let data1 = data["data1"] as! String 16 let data2 = data["data2"] as! String 17 let data3 = data["data3"] as! String 18 //取得した値を格納する 19 dataList = DataList(data1,data2,data3) 20 } 21 } else { 22 // API通信失敗 23 print(error as Any) 24 } 25 }.resume() 26 } 27}
回答1件
あなたの回答
tips
プレビュー