Ios 如何从异步方法返回多个结果?
注意:这个问题与所使用的语言无关,即Swift/Objective-C 我似乎不知道怎样才能解决这样的问题。 一个连续处理数据的异步方法如何将这些处理后的值返回给函数 示例->类名的类结构Ios 如何从异步方法返回多个结果?,ios,asynchronous,callback,Ios,Asynchronous,Callback,注意:这个问题与所使用的语言无关,即Swift/Objective-C 我似乎不知道怎样才能解决这样的问题。 一个连续处理数据的异步方法如何将这些处理后的值返回给函数 示例->类名的类结构 一个名为-(void)infoCallBack的方法,您必须调用该方法才能连续获取返回 在-(void)infoCallBack->内部有一个异步方法[self startRecording],它使用回调方法void AudioInputCallback(…param)使用音频队列异步进行音频录制 最后,在v
-(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);`)
我遇到了委托,它说,当连续返回不同的值并且某些内容的状态发生变化时,我们应该调用委托。但我被困在如何
块和委托通常用于类似的目的,您可以使用这两种方法中的任何一种来以基本相同的方式解决问题-将块/委托引用存储在实例变量中,调用块/委托方法以返回值。您只需决定哪个最适合您的用例:
- 块是一个函数。块通常在调用站点内联创建,并且可以在创建块的环境中引用(有时修改)变量。与任何函数一样,它(通常)是一个单一操作传递参数,产生副作用/返回结果
- 委托是一个对象。与任何其他对象一样,它需要一个接口/实现。像任何对象一样,它可以有多个方法,因此它是一个多操作的东西