CollectionViewの非同期処理
1.NCMBから画像のurlを取得し、
2.配列に加えた後
3.URLにアクセスして画像を取得
4.CollectionViewのCellの上に載っているImageViewに表示する
という作業をしたいのですが、データストアからデータを取得するより先に戻り値を返してしまい、処理が終了してしまいます。
4の処理を遅延させて、データストアからデータを取得し配列に加えた後に、CollectionViewのCellの上に載っているImageViewに表示するにはどうしたらよいのでしょうか。
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{
// クラスのNCMBObjectを作成
let obj = NCMBObject(className: "image")
// objectIdプロパティを設定
obj?.objectId = "xxxxxxxxxxxx"
// 設定されたobjectIdを元にデータストアからデータを取得
obj?.fetchInBackground { error in
if error != nil {
// 取得に失敗した場合の処理
}else{
// 取得に成功した場合の処理
// (例)取得したデータの出力
print(obj!.object(forKey: "imageUrl"))
self.imageUrlArray.append(obj!.object(forKey: "imageUrl") as! String)
}
}
// Cell はストーリーボードで設定したセルのID
let testCell:UICollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
var url = URL(string: self.imageUrlArray[indexPath.row])
do {
self.imageData = try Data(contentsOf: url!,options: NSData.ReadingOptions.mappedIfSafe);
} catch {
print("Error: can't create image.")
}
// Tag番号を使ってImageViewのインスタンス生成
let imageView = testCell.contentView.viewWithTag(1) as! UIImageView
// 画像配列の番号で指定された要素の名前の画像をUIImageとする
imageView.image = UIImage(data: self.imageData! as Data)
return testCell
}