相关疑难解决方法(0)

等待多个街区完成

我有这些方法从互联网上检索一些对象信息:

- (void)downloadAppInfo:(void(^)())success
                failure:(void(^)(NSError *error))failure;
- (void)getAvailableHosts:(void(^)())success
                  failure:(void(^)(NSError *error))failure;
- (void)getAvailableServices:(void(^)())success
                     failure:(void(^)(NSError *error))failure;
- (void)getAvailableActions:(void(^)())success
                    failure:(void(^)(NSError *error))failure;
Run Code Online (Sandbox Code Playgroud)

下载的东西存储在对象属性中,这就是成功函数不返回任何内容的原因.

现在,我想要一个像这样的方法:

- (void)syncEverything:(void(^)())success
               failure:(void(^)(NSError *error))failure;
Run Code Online (Sandbox Code Playgroud)

除了调用上面的所有方法之外,它只会在每个方法执行其成功或失败块之后返回.

我怎样才能做到这一点?

提示:我知道级联方法调用彼此成功块会起作用.但是,当后来的实现包括更多方法时,这既不"干净"也不有用.

尝试:

我尝试在a中运行每个调用NSOperation并将其添加NSOperations到a NSOperationQueue后跟"完成操作",这取决于前面的每个操作.

这不行.由于即使在各自的成功/失败块返回之前也认为操作已完成.

我也试过用dispatch_group.但我不清楚我是以正确的方式做到这一点.不幸的是,它没有用.

nsoperation nsoperationqueue grand-central-dispatch ios objective-c-blocks

13
推荐指数
2
解决办法
7218
查看次数

立即调用 DispatchGroup notification() - 不等待 Enter/Leave

我已经被这个问题困扰了一段时间了,而且我用完了有用的谷歌结果。

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

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

作为print()指导来了解到底发生了什么,我得到:

我正在下载网址

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

我正在下载图像

当它实际上应该下载 url 时,然后下载图像,然后返回到 UIViewController

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

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

这是代码:

class BannersHelper {
    
    private var bannersArr: [UIImage] = []
    private let dispatchGroup = DispatchGroup()
    private var delegate: LoadBanners? = nil
    
    init(delegate: LoadBanners) {
        self.delegate = delegate
        
        dispatchGroup.notify(queue: .main) {
            self.delegate?.setUpCollection(errImg: self.bannersArr)
        }
    }
    
    func requestBanners() {
        print("I'm downloading the urls\n")
        self.dispatchGroup.enter()
        ServiceParametria.getBanners(handler: { response …
Run Code Online (Sandbox Code Playgroud)

ios swift

4
推荐指数
1
解决办法
1352
查看次数