gpt4 book ai didi

c - 从 C 函数更新进度条

转载 作者:搜寻专家 更新时间:2023-10-31 23:03:46 24 4
gpt4 key购买 nike

我正在使用 Swift 开发适用于 iOS 8 的音频应用程序。加载 MIDI 文件,当用户按下“保存”按钮时,它会在手动提取样本的 C 函数中呈现为文件。
现在,我想为这个保存操作更新界面中的进度条。
我在 ViewController 中向 var 添加了一个属性观察器,并将指向此 var 的指针传递给 C 函数,希望它会在循环期间更新它……好吧,没有。即使 C 函数在循环内更新 var 的值,此更新也只会在最后“触发”一次。有没有办法更新进度条?
这是一些代码。
谢谢!

在 View Controller 中:

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, &currentTime), "MusicPlayerGetTime");
*outProgressBarValue = currentTime / sequenceLength;
printf("outProgressBarValue:\t %f\n", *outProgressBarValue);
} while (currentTime < sequenceLength);

CheckError(MusicPlayerStop(musicPlayer), "MusicPlayerStop");
[…]
}

最佳答案

如果观察不起作用,为什么不将更新显式发送到 Controller ?例如,通过 NSNotification。

这是我做的概念验证:

  1. 添加带有 .h 和 .m 文件的 Objective-C 类文件。无需在此文件中定义类,只需将您的 c 函数放在 .m 中,将声明放在 .h 中即可。

  2. 配置桥接 header ,在其中导入 .h 文件。桥接 header 通常称为“-Bridging-Header.h”。

  3. 您现在可以在任何 swift 类中调用您的函数。

  4. 在带有 c 函数的 .m 文件中,导入“<UIKit/UIkit.h>”(或 Foundation)。

  5. 需要时,从您的 c 函数发布类似于此的通知:

    NSNotification *notif = [[NSNotification alloc] initWithName:@"Update"
    object:nil userInfo:@{@"progress" : @0.42}];
    [[NSNotificationCenter defaultCenter] postNotification:notif];
  6. 在swift文件中,按照通常的步骤添加self作为通知的观察者并使用 userInfo 中传递的值调用更新函数字典。

关于c - 从 C 函数更新进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29728025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com