Я рассмотрел довольно много примеров использования группы рассылки, но, похоже, не могу заставить ее работать.
Я использую Google Maps для своего проекта и установил маркеры на близлежащих предприятиях. При нажатии на маркер, я хочу показать другой контроллер представления, который имеет изображения этого места.
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, который я добавляю в свой массив. Из того, что я понимаю, поиск фотографий и загрузка фотографий - это асинхронные вызовы. Как я могу использовать 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)
}
})
}