2012-11-19 150 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!"; 
}