Ios 如何从异步方法返回多个结果?

Ios 如何从异步方法返回多个结果?,ios,asynchronous,callback,Ios,Asynchronous,Callback,注意:这个问题与所使用的语言无关,即Swift/Objective-C 我似乎不知道怎样才能解决这样的问题。 一个连续处理数据的异步方法如何将这些处理后的值返回给函数 示例->类名的类结构 一个名为-(void)infoCallBack的方法,您必须调用该方法才能连续获取返回 在-(void)infoCallBack->内部有一个异步方法[self startRecording],它使用回调方法void AudioInputCallback(…param)使用音频队列异步进行音频录制 最后,在v

注意:这个问题与所使用的语言无关,即Swift/Objective-C

我似乎不知道怎样才能解决这样的问题。 一个连续处理数据的异步方法如何将这些处理后的值返回给函数

示例->类名的类结构

  • 一个名为
    -(void)infoCallBack
    的方法,您必须调用该方法才能连续获取返回
  • -(void)infoCallBack
    ->内部有一个异步方法
    [self startRecording]
    ,它使用回调方法
    void AudioInputCallback(…param)
    使用音频队列异步进行音频录制
  • 最后,在
    void AudioInputCallback(…param..)
    ->中有一个方法
    -(void)processAudio
    ,它连续处理数据并给我们一个整数
  • 如何调用像
    [ClassName infoCallBack]
    这样的方法,使我们能够连续地获取所有这些经过处理的整数


    Edit:我搜索了SO,发现了完成处理程序块:尽管完成处理程序只在调用
    completionHandler()
    后返回一次值。此外,此方法中的另一个问题是如何将此
    completionHandler
    传递给类名结构中的多个方法,如图所示


    我遇到了委托,它说,当连续返回不同的值并且某些内容的状态发生变化时,我们应该调用委托。但是,在从ClassName调用函数infoCallBack之后,我一直在思考如何返回值,即,
    [ClassName infoCallBack]
    可以不断地向调用此函数的人提供正在处理的值。

    事实上,我不完全理解你的问题,但我会以我的理解给你答案

    在我看来,您可以使用块来处理进程更新

    typedef void (^ProcessHandlerBlock) (NSInteger i);
    
    - (void)infoCallBackWithProcessHandlerBlock:(ProcessHandlerBlock)block {
      [self startRecordingWithProcessHandlerBlock:(ProcessHandlerBlock)block];
    }
    
    - (void)startRecordingWithProcessHandlerBlock:(ProcessHandlerBlock)block {
      [self audioInputCallbackWithParam1:@"1" param2:@"2" processHandlerBlock:(ProcessHandlerBlock)block];
    }
    
    - (void)audioInputCallbackWithParam1:(id)param1 param2:(id)param2 processHandlerBlock:(ProcessHandlerBlock)block {
      [self processAudioWithProcessHandlerBlock:(ProcessHandlerBlock)block];
    }
    
    - (void)processAudioWithProcessHandlerBlock:(ProcessHandlerBlock)block {
      // Assume this is your process method callback
      [NSTimer scheduledTimerWithTimeInterval:1.f repeats:YES block:^(NSTimer * _Nonnull timer) {
        // After receive integer, pass it to block.
        block(1);
      }];
    }
    
    如果您想使用它们,请致电

    [self infoCallBackWithProcessHandlerBlock:^(NSInteger i) {
      NSLog(@"%l", i); // Do whatever you want here
    }];
    

    infoCallBackWithProcessHandlerBlock
    方法的完成块中,您可以使用result integer来做您想做的事情。

    实际上,我并不完全理解您的问题,但我会在理解的基础上给您答案

    在我看来,您可以使用块来处理进程更新

    typedef void (^ProcessHandlerBlock) (NSInteger i);
    
    - (void)infoCallBackWithProcessHandlerBlock:(ProcessHandlerBlock)block {
      [self startRecordingWithProcessHandlerBlock:(ProcessHandlerBlock)block];
    }
    
    - (void)startRecordingWithProcessHandlerBlock:(ProcessHandlerBlock)block {
      [self audioInputCallbackWithParam1:@"1" param2:@"2" processHandlerBlock:(ProcessHandlerBlock)block];
    }
    
    - (void)audioInputCallbackWithParam1:(id)param1 param2:(id)param2 processHandlerBlock:(ProcessHandlerBlock)block {
      [self processAudioWithProcessHandlerBlock:(ProcessHandlerBlock)block];
    }
    
    - (void)processAudioWithProcessHandlerBlock:(ProcessHandlerBlock)block {
      // Assume this is your process method callback
      [NSTimer scheduledTimerWithTimeInterval:1.f repeats:YES block:^(NSTimer * _Nonnull timer) {
        // After receive integer, pass it to block.
        block(1);
      }];
    }
    
    如果您想使用它们,请致电

    [self infoCallBackWithProcessHandlerBlock:^(NSInteger i) {
      NSLog(@"%l", i); // Do whatever you want here
    }];
    
    infoCallBackWithProcessHandlerBlock
    方法的completion块中,您可以使用result integer执行所需操作

    我似乎不知道怎样才能解决这样的问题

    从你所写的其他内容来看,我想你可以想一想,你可能只需要休息一下。你已经找到了答案,却没有意识到

    我搜索过,发现了完成处理程序块:尽管完成处理程序只在调用completionHandler()后返回一次值

    短语“completion handler block”可以写为“用作完成处理程序的块”-块只是一个块,您可以根据需要多次调用它,将它存储在变量中,等等。虽然完成处理程序通常只调用一次,例如,结果报告器可能被多次调用

    此外,此方法中的另一个问题是如何将此completionHandler传递给类名结构中的多个方法,如图所示

    块是一种对象,与类实例可能需要在许多方法中使用的其他对象一样,它不需要传递,但可以存储在实例变量中。为便于使用,请首先声明块类型的简写,例如:

    typedef void (^SampleHandler)(int i);
    
    然后声明一个合适的实例变量:

    @implementation ClassName
    {
       SampleHandler mySampleHandler;
    }
    
    现在像使用任何其他实例变量一样使用它-初始化它(mySampleHandler=…;
    ),使用它调用块(
    mySampleHandler(42);`)

    我遇到了委托,它说,当连续返回不同的值并且某些内容的状态发生变化时,我们应该调用委托。但我被困在如何

    块和委托通常用于类似的目的,您可以使用这两种方法中的任何一种来以基本相同的方式解决问题-将块/委托引用存储在实例变量中,调用块/委托方法以返回值。您只需决定哪个最适合您的用例:

    • 块是一个函数。块通常在调用站点内联创建,并且可以在创建块的环境中引用(有时修改)变量。与任何函数一样,它(通常)是一个单一操作传递参数,产生副作用/返回结果

      • 委托是一个对象。与任何其他对象一样,它需要一个接口/实现。像任何对象一样,它可以有多个方法,因此它是一个多操作的东西
    在您的情况下,返回值块可能是最好的选择,但您需要做出决定

    我似乎不知道怎样才能解决这样的问题

    从你所写的其他内容来看,我想你可以想一想,你可能只需要休息一下。你已经找到了答案,却没有意识到

    我搜索过,发现了完成处理程序块:尽管完成处理程序只在调用completionHandler()后返回一次值

    短语“completion handler block”可以写为“用作完成处理程序的块”-块只是一个块,您可以根据需要多次调用它,将它存储在变量中,等等。虽然完成处理程序通常只调用一次,例如,结果报告器可能被多次调用

    此外,此方法中的另一个问题是如何将此completionHandler传递给cla中的多个方法