1

我有一个名为recordingStatus 的int 变量。我想“收听”这个记录状态并根据这个变量的状态更新我的标签。

int recordingStatus;

@property (strong, nonatomic) IBOutlet UILabel *recordingStatusText;

我必须这样做的原因是我的 C 代码(也在同一个文件中)中正在更改recordingStatus,并且 C 代码无法访问 UI 元素(据我所知)。

在 iOS 中最优雅的方法是什么?

C 代码核心音频回调

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?
}

谢谢。

码头。

4

3 回答 3

1

recordingStatus为您的对象创建一个属性。然后您可以覆盖 setter 方法并在该方法中执行您需要的任何 UI 更新。这样,C 代码就无需担心 UI,Objective-C 代码可以处理 Objective-C UI 更新。

于 2012-11-19T02:24:20.857 回答
0

有多种方法可以解决这个问题。正如 Rickay 所指出的,您可以将其设为一个属性,然后重写设置器来设置标签的值。

另一种方法是使用 KVO 进行监控recordingStatus(它仍然需要有一个属性)。如果你正在寻找一种超级棒的方式来使用 KVO,请查看ReactiveCocoa。这种类型的观察反应模式被称为反应式编程

于 2012-11-19T02:37:41.507 回答
-1

参考iOS上Audio Unit Render Proc的另一个线程Triggering UI code

我将 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!";
}
于 2012-11-19T14:07:02.387 回答