我有一个名为recordingStatus的int变量。 我想“收听”此录制状态,并根据此变量的状态更新我的标签。
int recordingStatus;
@property (strong, nonatomic) IBOutlet UILabel *recordingStatusText;
我必须这样做的原因是我的C代码(也在同一个文件中)正在更改recordingStatus,并且C代码无法访问UI元素(据我所知)。
iOS中最优雅的方式是什么?
C Code Core Audio Callback
static OSStatus rioRecordingCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData) {
// want to access recordingStatus in here, am I able to do it without passsing it in via inRefCon?
}
感谢。
码头。
答案 0 :(得分:1)
使recordingStatus
成为对象的属性。然后,您可以覆盖setter方法,并在该方法中执行您需要的任何UI更新。这样,C代码不需要担心UI,而Objective-C代码可以处理Objective-C UI更新。
答案 1 :(得分:1)
有多种方法可以解决这个问题。正如Rickay所说,你可以将它作为一个属性,并覆盖setter来设置你的标签的价值。
另一种方法是使用KVO来监控recordingStatus
(它仍然需要具有属性)。如果您正在寻找使用KVO的超棒方式,请查看ReactiveCocoa。这种观察反应模式称为反应式编程。
答案 2 :(得分:0)
参考另一个帖子Triggering UI code from Audio Unit Render Proc on iOS
我将recordingStatus放入一个传递给音频回调的结构中,一个主循环以平均刷新率60hz轮询该值,因此(1/60 == 0.02秒)。
- (void) initTimer
{
self.UIUpdateTimer =
[NSTimer scheduledTimerWithTimeInterval:0.02
target:self selector:@selector(pollValues:)
userInfo:nil
repeats:YES];
}
- (void) pollValues:(NSTimer *)paramTimer
{
if (rio.recordingStatus==1)
recordingStatusLabel.text = @"test!";
}