Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在从主函数返回值之前等待委托函数完成_Ios_Objective C_Asynchronous_Camera_Delegates - Fatal编程技术网

Ios 如何在从主函数返回值之前等待委托函数完成

Ios 如何在从主函数返回值之前等待委托函数完成,ios,objective-c,asynchronous,camera,delegates,Ios,Objective C,Asynchronous,Camera,Delegates,我有一个用于捕获真实深度相机信息的自定义函数,该函数在代理函数完成处理捕获的照片之前返回。在返回正确的值之前,我需要以某种方式等待代理全部完成 我尝试将主函数调用包装到一个同步块中,但这并没有解决问题 - (NSDictionary *)capture:(NSDictionary *)options resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { if (@available(iOS

我有一个用于捕获真实深度相机信息的自定义函数,该函数在代理函数完成处理捕获的照片之前返回。在返回正确的值之前,我需要以某种方式等待代理全部完成

我尝试将主函数调用包装到一个同步块中,但这并没有解决问题

- (NSDictionary *)capture:(NSDictionary *)options resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject
{
  if (@available(iOS 11.1, *)) {
      // Set photosettings to capture depth data
      AVCapturePhotoSettings *photoSettings = [AVCapturePhotoSettings photoSettingsWithFormat:@{AVVideoCodecKey : AVVideoCodecJPEG}];
      photoSettings.depthDataDeliveryEnabled = true;
      photoSettings.depthDataFiltered = false;
      @synchronized(self) {
          [self.photoOutput capturePhotoWithSettings:photoSettings delegate:self];
      }
  }
  // Somehow need to wait here until the delegate functions finish before returning
  return self.res;
}
调用太晚的委托函数:

- (void)captureOutput:(AVCapturePhotoOutput *)output didFinishProcessingPhoto:(AVCapturePhoto *)photo error:(NSError *)error
{
  Cam *camera = [[Cam alloc] init];
  self.res = [camera extractDepthInfo:photo];
}

目前,
nil
是在调用委托之前返回的,只有在调用委托之后,委托函数才会将所需的结果分配给
self.res
我相信您要找的是
dispatch\u semaphore\t

信号量允许您锁定线程,直到执行辅助操作。通过这种方式,您可以推迟方法的返回,直到委托返回为止(如果您在辅助线程上操作)

这种方法的问题是,您将锁定线程!因此,如果您在主线程中操作,您的应用程序将变得不响应

我建议您考虑将响应移动到一个完成块,类似于:

-(void)捕获:(NSDictionary*)选项解析:(RCTPromiseResolveBlock)解析拒绝:(RCTPromiseResolveBlock)拒绝完成:(void(^)(NSDictionary*)完成{
自我完成=完成
...
}
并在结尾处调用完成:

-(void)captureOutput:(AVCapturePhotoOutput*)输出未完成处理照片:(AVCapturePhoto*)照片错误:(N错误*)错误
{
Cam*摄像机=[[Cam alloc]init];
self.res=[camera extractedDepthinfo:photo];
自我完成(self.res);
}

不要将异步函数转换为同步函数将闭包传递给函数,并在结果可用时调用它。您应该开始异步思考。你需要一个带有完成块的函数,而不是同步返回值。。。复数的有多少?@MobileBen那是我的错,我只有一个委托函数。就这样解决了。谢谢你的帮助!:)