2012-11-19 119 views
1

我有一个名为recordingStatus的int变量。 我想“监听”此录制状态并根据此变量的状态更新我的标签。iOS - 更改变量值的UI更改

int recordingStatus; 

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

我之所以这样做,是在我的C代码被更改recordingStatus(也是在同一个文件)和C代码没有访问UI元素(据我所知)。

什么是最优雅的方式来做到这一点在iOS?

C代码的Core Audio回调

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

我最终找到了我需要的解决方案,对于音频呈现c代码,其中时间很关键,建议使用计时器对所讨论的变量进行轮询。 http://stackoverflow.com/questions/7151772/triggering-ui-code-from-audio-unit-render-proc-on-ios – lppier

回答

1

有多种方法可以解决这个问题。正如Rickay指出的那样,您可以将其作为一个属性,并仅仅覆盖setter来设置标签的值。

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

+0

感谢sudo rm -rf ..当我有时间时,我会检查出KVO :)现在,更简单的方法就足够了。 – lppier

+0

谢谢,无论如何,我会接受你的答案,因为我从中学到了一些东西:) – lppier

1

使recordingStatus属性的对象。然后,您可以重写setter方法,并在该方法中执行所需的任何UI更新。这样,C代码不需要担心UI,Objective-C代码可以处理Objective-C UI更新。

+0

谢谢..我该如何让recordingStatus对我的C代码可见呢?我已经完成了这个 - @synthesize recordingStatus,后面跟着 - (void)setRecordingStatus:(int)recordingStatus recordingStatusText.text = @“Just testing!”; } – lppier

+0

您可以像访问其他对象一样访问该对象的属性。如果你正在讨论在C函数内部访问'self',你将需要传递一个引用给你想要改变其属性的实例。 –

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