Ios 从installTapOnBus闭包中访问类属性

Ios 从installTapOnBus闭包中访问类属性,ios,swift,core-audio,avaudioengine,Ios,Swift,Core Audio,Avaudioengine,我有一个非常简单的installTapOnBus闭包,它成功地更新了控制台,但没有更新UI元素。代码如下: self.meter.text="..." let inputNode = audioEngine.inputNode let bus = 0 inputNode!.installTapOnBus(bus, bufferSize: 2048, format: inputNode!.inputFormatForBus(bus)) { (buffer: AVAudioPCMBuffe

我有一个非常简单的
installTapOnBus
闭包,它成功地更新了控制台,但没有更新UI元素。代码如下:

self.meter.text="..."
let inputNode = audioEngine.inputNode
let bus = 0

inputNode!.installTapOnBus(bus, bufferSize: 2048, format: inputNode!.inputFormatForBus(bus)) {
    (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in
        var someFeature:Float=0.0
        for var i=0; i<Int(buffer.frameLength); i += 1{
           someFeature += fabs(buffer.floatChannelData.memory[i])
        }
        someFeature /= Float(buffer.frameLength)
        self.meter.text="\(someFeature)" // No effect!
        print("\(someFeature)") // This works
    }
self.meter.text=“…”
让inputNode=audioEngine.inputNode
让总线=0
inputNode!。installTapOnBus(总线,缓冲区大小:2048,格式:inputNode!.inputFormatForBus(总线)){
(缓冲区:avaudiopcbuffer!,时间:AVAudioTime!)->在
var someFeature:Float=0.0

对于var i=0;i解决方案似乎在主线程上调用
self.meter.text=…

dispatch_async(dispatch_get_main_queue()) { 
    self.meter.text="\(someFeature)"
}

我将在一两天内不检查此答案,以防有人可以填写更多详细信息。

解决方案似乎是在主线程上调用
self.meter.text=…

dispatch_async(dispatch_get_main_queue()) { 
    self.meter.text="\(someFeature)"
}

我会在一两天内不检查这个答案,以防有人可以填写更多的细节。

您应该只从主线程调用UIKit

从UIView的:

线程注意事项

对应用程序用户界面的操作必须在主线程上进行。因此,您应该始终从应用程序主线程中运行的代码中调用UIView类的方法。这可能不是严格必要的唯一时间是在创建视图对象本身时,但所有其他操作都应该在主线程上进行线程

如果您查看API参考资料,具体如下:

tapBlock可以在主线程以外的线程上调用

您的UI未更新,因为来自
inputNode!.installTapOnBus()
的回调正在后台线程上执行,然后您尝试从此线程更新UI

正如您所发现的,您将希望通过以下方式从主线程进行UI调用:

dispatch_async(dispatch_get_main_queue(), ^{
   /* Make UIKit calls here */
});

您应该只从主线程进行UIKit调用

从UIView的:

线程注意事项

对应用程序用户界面的操作必须在主线程上进行。因此,您应该始终从应用程序主线程中运行的代码中调用UIView类的方法。这可能不是严格必要的唯一时间是在创建视图对象本身时,但所有其他操作都应该在主线程上进行线程

如果您查看API参考资料,具体如下:

tapBlock可以在主线程以外的线程上调用

您的UI未更新,因为来自
inputNode!.installTapOnBus()
的回调正在后台线程上执行,然后您尝试从此线程更新UI

正如您所发现的,您将希望通过以下方式从主线程进行UI调用:

dispatch_async(dispatch_get_main_queue(), ^{
   /* Make UIKit calls here */
});