我已经看过很多使用调度组的例子,但我似乎无法让它工作。
我在我的项目中使用谷歌地图,并在附近的商家放置了标记。单击标记时,我想显示另一个具有该地点图像的视图控制器。
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 完成后通知主线程继续?因为现在,当我想显示视图控制器时,UIImages 数组是空的。
提前致谢!
下面的代码是我在 loadPhotosForSalonByPlaceId 函数中调用的代码。它将 PhotoMetaData 转换为 UIImage,我将其附加到我的数组中。据我了解,查找照片和 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)
}
})
}