0

ディスパッチ グループの使用例をいくつか見てきましたが、うまく動作しないようです。

私は自分のプロジェクトに 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)

        }
    })
}
4

1 に答える 1