繁体   English   中英

enumerateObjectsUsingBlock和完成一起

[英]enumerateObjectsUsingBlock and completion together

我遇到的情况是我要使用enumerateObjectsUsingBlock迭代数组对象,并且我需要等待迭代完成,然后它应该执行更多代码,如何实现这一目标,或者如果我应该使用任何替代方法,以下是我的代码

[arrPendingQueue enumerateObjectsUsingBlock:^(PendingQueues *obj, NSUInteger idx, BOOL *stop) {

       //Fetch static google map based on coordinates
       [self generateMapImage:obj.postObj completion:^(UIImage *image) {
           NSString *path = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"camera"];

          NSString *resultPath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"map_%f.jpg",[[Constants getSystemDateInLocalTimeZone] timeIntervalSince1970]]];

          [[NSFileManager defaultManager] createFileAtPath:resultPath contents:UIImageJPEGRepresentation(image, 1.0) attributes:nil];

          postObj.imagepath = [@"camera" stringByAppendingPathComponent:[resultPath lastPathComponent]];

          [DataManager saveObject:postObj];                                             
       }];

       //After the completion I want to upload the data here to server

});

基本上,我试图从函数generateMapImage坐标下载静态谷歌地图,我希望循环一直等到完成调用。

为此,我试图使用dispatch_semaphore_create

[arrPendingQueue enumerateObjectsUsingBlock:^(PendingQueues *obj, NSUInteger idx, BOOL *stop) {
     dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

     [self generateMapImage:obj.postObj completion:^(UIImage *image) {

         dispatch_semaphore_signal(semaphore);                                    
     }];

     dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

});

但是它不起作用,它不会等待,并在完成之前执行代码。

如何解决,请帮忙。

谢谢。

要排队执行一系列块,只需在旧块的完成处理程序中启动新块即可:

NSEnumerator *objectEnum = [arrPendingQueue objectEnumerator];
__block void (^handler) ();
handler = ^(UIImage *image)
{
   // Handle image
   object = [objectEnum nextObject];
   if( object == nil )
   {
     // completion of all operations
   }
   else 
   {
     // Start next operation
     [self generateMapImage:object.postObj completion:handler];
   }                                    
 };
 [self generateMapImage:obj.postObj completion:handler];
}

一种更经典或优雅的方法是使用Y组合器 但这不是必需的。 请记住,丢失本地作用域时会清除它们。 handler未保留。 因此,也许您必须将其放入一个ivar中。

但是,我看到-generateMapImage:completion由您编写。 我看不到内容,但是如果您在那里进行异步调用,并且可以设置用于调用的队列,只需将其设置为串行队列即可。 在这种情况下,您的请求将自动串行执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM