Ios 立即调用DispatchGroup notify()-不等待进入/离开

Ios 立即调用DispatchGroup notify()-不等待进入/离开,ios,swift,Ios,Swift,我已经被这个问题困扰了一段时间了,我已经没有有用的谷歌搜索结果了 我有两个请求,第一个请求从服务器检索一些链接,另一个请求我从链接下载图像。下载完所有图像后,我将结果返回给视图控制器 Int从UIViewController调用代码requestBanners(),进入调度组。理论上,在离开调度组之前,应该为我从服务器获得的每个url调用storeImage(),并且在每次调用时,它应该进入和离开调度组,将图像添加到数组中。下载完所有图像后,它将离开调度组,并在UIViewController上

我已经被这个问题困扰了一段时间了,我已经没有有用的谷歌搜索结果了

我有两个请求,第一个请求从服务器检索一些链接,另一个请求我从链接下载图像。下载完所有图像后,我将结果返回给视图控制器

Int从UIViewController调用代码
requestBanners()
,进入调度组。理论上,在离开调度组之前,应该为我从服务器获得的每个url调用
storeImage()
,并且在每次调用时,它应该进入和离开调度组,将图像添加到数组中。下载完所有图像后,它将离开调度组,并在UIViewController上启动
notify()
以执行
setUpCollection()

使用
print()
作为指导,查看实际发生的情况,我得到:

我正在下载网址

现在我在UIViewController中 (此
print()
setUpCollection()的实现中调用)

我正在下载一张图片

它实际上应该下载URL,然后下载图像,然后才返回UIViewController

起初我使用了信号量,但后来我认为使用调度组将是一个更干净的解决方案

在这两种方法中,在完成图像下载之前返回空的bannersArr。也许那张紧凑的地图把一切都搞砸了

代码如下:

class BannersHelper{
私有变量bannersArr:[UIImage]=[]
私有let dispatchGroup=dispatchGroup()
私有变量委托:LoadBanner?=nil
初始化(代理:加载横幅){
self.delegate=委托
dispatchGroup.notify(队列:.main){
self.delegate?.setUpCollection(错误:self.bannersArr)
}
}
func请求横幅(){
打印(“我正在下载URL\n”)
self.dispatchGroup.enter()
getBanners(处理程序:{response in
guard let BannerResponse=响应为?BannerModel else{
返回
}
让banners=bannersResponse.data as![DataBannerModel]
let=banners.compactMap({self.storeImage(model:$0)})
self.dispatchGroup.leave()
})
}
专用func storeImage(型号:DataBannerModel){
打印(“我正在下载图像\n”)
self.dispatchGroup.enter()
ServiceParameteria.getImage(url:model.urlImagen!,处理程序:{结果为
让image=结果为!UIImage
self.bannersArr.append(图像)
self.dispatchGroup.leave()
})
}
}

是否有更好的方法来执行此操作,或者我只是错误地使用了调度组?

正如@pkamb在评论中指出的,问题是我试图在
init()
方法中启动
dispatchGroup.notify()

在执行时,由于我还没有调用
requestBanners()
,DispatchGroup计数器等于零,这导致提前调用带有空数组的
delegate?.setUpCollection()


移动
dispatchGroup.notify()
方法末尾的
requestBanners()
块解决了问题:)

目标是在继续之前下载所有图像,还是在继续之前按特定顺序下载所有图像?目标是在获得URL后开始下载URL,开始下载存储在该url中的图像,当所有图像下载完毕后,我才应该返回图像数组。我会编辑这个问题,也许问题不太清楚,那么调度组就是解决的办法。你用错了,但这是正确的机制。这是否回答了你的问题?即使稍后从VC调用
requestbanner()
,也为时已晚。
dispatchGroup.notify
将在
init
中以空横幅数组启动。它不会在以后自动重新发射。。。一旦。。。在本例中,它立即位于
init()
中。您需要将
notify()
移动到
requestbanner()
函数的末尾。