iOS - 更改了变量值的更新UI

时间:2012-11-19 02:21:48

标签: ios variables listener

我有一个名为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?
}

感谢。

码头。

3 个答案:

答案 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!";
}