ディスパッチ グループの使用例をいくつか見てきましたが、うまく動作しないようです。
私は自分のプロジェクトに Google マップを使用しており、近くの企業にマーカーを配置しています。マーカーをクリックすると、その場所の画像を持つ別のビュー コントローラーを表示したいと考えています。
func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool {
self.loadPhotosForSalonByPlaceId(placeID: poiItem.placeId)
photoDispatchGroup.wait()
let salonInfoViewController = self.addPullUpController() //show view controller
salonInfoViewController.ImageCarouselView.images = self.salonImages
salonInfoViewController.salonName.text = poiItem.name
salonInfoViewController.salonAddress.text = poiItem.address
salonInfoViewController.openAppointmentSlotArray = self.openAppointmentSlots
self.isSalonInfoViewPresented = true
return isSalonInfoViewPresented
}
これは私の loadPhotosForSalonByPlaceId がどのように見えるかです:
func loadPhotosForSalonByPlaceId(placeID: String){
var countToLimitToFiveImages = 0
GMSPlacesClient.shared().lookUpPhotos(forPlaceID: placeID) { (photos, error) -> Void in
if let error = error {
// TODO: handle the error.
print("Error: \(error.localizedDescription)")
} else {
for photoMetadata in (photos?.results)! {
if countToLimitToFiveImages == 5 {
break;
}
self.photoDispatchGroup.enter()
self.loadImageForMetadata(photoMetadata: photoMetadata)
self.photoDispatchGroup.leave()
countToLimitToFiveImages += 1
}
}
}
}
エンターとリーブの使い方を間違えていませんか?それとも、lookUpPhotos の完了後に続行するようにメイン スレッドに通知する必要がありますか? 現時点では、View Controller を表示する時点で UIImages の配列が空になっているためです。
前もって感謝します!
以下のコードは、loadPhotosForSalonByPlaceId 関数で呼び出すものです。PhotoMetaData を UIImage に変換し、それを配列に追加します。私の理解では、look up photos と loadplacephoto は非同期呼び出しです。これらの両方のタスクが完了した後、DispatchGroup を使用してビュー コントローラーを表示するにはどうすればよいでしょうか。
func loadImageForMetadata(photoMetadata: GMSPlacePhotoMetadata) {
var image = UIImage()
GMSPlacesClient.shared().loadPlacePhoto(photoMetadata, callback: {
(photo, error) -> Void in
if let error = error {
// TODO: handle the error.
print("Error: \(error.localizedDescription)")
} else {
image = photo!
self.salonImages.append(image)
}
})
}