我正在使用Swift为iOS 8开发一款音频应用程序。该应用程序可以加载MIDI文件,当用户单击“保存”按钮时,它会渲染到文件中。在C函数中,需要手动提取样本。
现在,我想要更新界面上的进度条以反映保存进度。
我在ViewController中添加了一个属性观察器来监测变量,我将这个变量的指针传递给C函数,希望能够在循环过程中更新值。然而,即使C函数在循环内部更新了变量的值,这个更新只会在最后被“触发”。
有没有办法更新进度条?
下面是一些代码。
谢谢!
现在,我想要更新界面上的进度条以反映保存进度。
我在ViewController中添加了一个属性观察器来监测变量,我将这个变量的指针传递给C函数,希望能够在循环过程中更新值。然而,即使C函数在循环内部更新了变量的值,这个更新只会在最后被“触发”。
有没有办法更新进度条?
下面是一些代码。
谢谢!
在ViewController中:
var outProgressBarValue:Float = 0.0 {
willSet {
dispatch_async(dispatch_get_main_queue(), {
println("New value received! -> \(newValue)")
self.progressBarOutlet.setProgress(newValue, animated: true)
})
}
}
@IBAction func saveButton(sender: AnyObject) {
[...]
let backgroundQueue = dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0)
dispatch_async(backgroundQueue, {
WriteOutputFile(url, self.musicSequence!, Sound.sharedInstance.musicPlayer, self.processingGraph, &self.outProgressBarValue)
dispatch_async(dispatch_get_main_queue(), {
restoreOnlineRendering(processingGraph: self.processingGraph, mainMixerNode: self.mainMixerNode, ioNode: &(self.ioNode))
self.saveButtonOutlet.setTitle("Done", forState: UIControlState.Normal)
[...]
}
在一个链接的C文件中:
void WriteOutputFile(CFURLRef url, MusicSequence musicSequence, MusicPlayer musicPlayer, AUGraph processingGraph, float *outProgressBarValue) {
[…]
CheckError(MusicPlayerStart(musicPlayer), "MusicPlayerStart");
do {
CheckError(AudioUnitRender (outputUnit, &actionFlags, &tStamp, 0, numFrames, bufferList), "AudioUnitRender");
tStamp.mSampleTime += (Float64)numFrames;
CheckError(ExtAudioFileWrite(outfile, numFrames, bufferList), "ExtAudioFileWrite");
CheckError(MusicPlayerGetTime (musicPlayer, ¤tTime), "MusicPlayerGetTime");
*outProgressBarValue = currentTime / sequenceLength;
printf("outProgressBarValue:\t %f\n", *outProgressBarValue);
} while (currentTime < sequenceLength);
CheckError(MusicPlayerStop(musicPlayer), "MusicPlayerStop");
[…]
}