gpt4 book ai didi

ios - 如何使用 DispatchGroup 查找照片并将其存储在 UIImage 数组中

转载 作者:行者123 更新时间:2023-11-30 11:10:59 27 4
gpt4 key购买 nike

我已经看过很多使用调度组的示例,但我似乎无法让它工作。

我正在为我的项目使用 Google map ,并在附近的商家处放置了标记。单击标记时,我想显示另一个包含该地点图像的 View Controller 。

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,我将其附加到数组中。据我了解,查找照片和 loadplacephoto 是异步调用。在这两个任务完成后,如何使用 DispatchGroup 来显示我的 View Controller 。

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)

}
})
}

最佳答案

您目前对 DispatchGroup 的使用是完全错误的。您应该在异步进程开始之前调用 enter,并在异步进程完成时调用 leave。并且永远不要在主队列上调用wait。您可能需要使用notify。不过,在这种情况下,不要使用调度组。

这里有两个级别的异步调用。第一个位于 loadImageForMetadata 中。需要重构以提供完成处理程序。第二个位于 loadPhotosForSalonByPlaceId 中,它也需要重构以提供完成处理程序。您还需要重新使用调度组。

这是您重构的loadImageForMetadata:

func loadImageForMetadata(photoMetadata: GMSPlacePhotoMetadata, completion: (Bool) -> Void) {
var image = UIImage()
GMSPlacesClient.shared().loadPlacePhoto(photoMetadata, callback: {
(photo, error) -> Void in
if let error = error {
// TODO: handle the error.
print("Error: \(error.localizedDescription)")
completion(false)
} else {
image = photo!
self.salonImages.append(image)
completion(true)
}
})
}

下面是重构后的 loadPhotosForSalonByPlaceId,其中包含完成处理程序以及 DispatchGroup 的正确使用:

func loadPhotosForSalonByPlaceId(placeID: String, completion: (Bool) -> Void) {
var countToLimitToFiveImages = 0
GMSPlacesClient.shared().lookUpPhotos(forPlaceID: placeID) { (photos, error) -> Void in
if let error = error {
// TODO: handle the error.
print("Error: \(error.localizedDescription)")
completion(false)
} else {
let group = DispatchGroup()

for photoMetadata in (photos?.results)! {
if countToLimitToFiveImages == 5 {
break;
}
group.enter()
self.loadImageForMetadata(photoMetadata: photoMetadata) { (success) in
if success {
countToLimitToFiveImages += 1
}
group.leave()
}
}

group.notify(queue: DispatchQueue.global()) {
completion(true)
}
}
}
}

然后更新您的用法:

func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool {
self.loadPhotosForSalonByPlaceId(placeID: poiItem.placeId) { (success) in
if success {
DispatchQueue.main.async {
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
}

关于ios - 如何使用 DispatchGroup 查找照片并将其存储在 UIImage 数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52176597/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com