我有这些方法从互联网上检索一些对象信息:
- (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;
下载的东西存储在对象属性中,这就是成功函数不返回任何内容的原因.
现在,我想要一个像这样的方法:
- (void)syncEverything:(void(^)())success
               failure:(void(^)(NSError *error))failure;
除了调用上面的所有方法之外,它只会在每个方法执行其成功或失败块之后返回.
我怎样才能做到这一点?
提示:我知道级联方法调用彼此成功块会起作用.但是,当后来的实现包括更多方法时,这既不"干净"也不有用.
尝试:
我尝试在a中运行每个调用NSOperation并将其添加NSOperations到a NSOperationQueue后跟"完成操作",这取决于前面的每个操作.
这不行.由于即使在各自的成功/失败块返回之前也认为操作已完成.
我也试过用dispatch_group.但我不清楚我是以正确的方式做到这一点.不幸的是,它没有用.
nsoperation nsoperationqueue grand-central-dispatch ios objective-c-blocks
我已经被这个问题困扰了一段时间了,而且我用完了有用的谷歌结果。
我有两个请求,第一个请求从服务器检索一些链接,在另一个请求中我从链接下载图像。所有图像下载完成后,我将结果返回到视图控制器。
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 …