如何在 Swift 中停止 ViewController?

How to stop ViewController in Swift?

我的ViewController仍在发送数组更新,即使我在另一个视图中,我该怎么办?这是我的代码:

import UIKit
import CoreBluetooth

class ViewController: UIViewController {
var audioVibe : AudioVibes!
var superpowered:Superpowered!
var displayLink:CADisplayLink!
var layers:[CALayer]!
var magnitudeArray : [UInt16] = [0, 0, 0, 0, 0, 0, 0]


override func viewDidLoad() {
    super.viewDidLoad()

    // Setup 8 layers for frequency bars.
    let color:CGColorRef = UIColor(red: 0, green: 0.6, blue: 0.8, alpha: 1).CGColor
    layers = [CALayer(), CALayer(), CALayer(), CALayer(), CALayer(), CALayer(), CALayer(), CALayer()]
    for n in 0...7 {
        layers[n].backgroundColor = color
        layers[n].frame = CGRectZero
        self.view.layer.addSublayer(layers[n])
    }

    superpowered = Superpowered()

    // A display link calls us on every frame (60 fps).
    displayLink = CADisplayLink(target: self, selector: #selector(ViewController.onDisplayLink))
    displayLink.frameInterval = 1
    displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)
}

// Gets triggered when you leave the ViewController.
override func viewWillDisappear(animated: Bool) {
    superpowered.togglePlayback();
    superpowered.moritz();
    //delete(superpowered);
}

func onDisplayLink() {
    // Get the frequency values.
    let magnitudes = UnsafeMutablePointer<Float>.alloc(8)
    superpowered.getMagnitudes(magnitudes)

    // Wrapping the UI changes in a CATransaction block like this prevents animation/smoothing.
    CATransaction.begin()
    CATransaction.setAnimationDuration(0)
    CATransaction.setDisableActions(true)

    // Set the dimension of every frequency bar.
    let originY:CGFloat = self.view.frame.size.height - 20
    let width:CGFloat = (self.view.frame.size.width - 47) / 5
    var frame:CGRect = CGRectMake(20, 0, width, 0)
    for n in 0...4 {
        frame.size.height = CGFloat(magnitudes[n]) * 2000
        frame.origin.y = originY - frame.size.height
        layers[n].frame = frame
        frame.origin.x += width + 1
    }

    // Set the magnitudes in the array.
    for n in 0...6 {
        magnitudeArray[n] = UInt16(magnitudes[n] * 32768)
    }

    // Update the array in the audioVibe class to trigger the sending command.
    audioVibe.magnitudeArray = magnitudeArray

    CATransaction.commit()

    // Dealloc the magnitudes.
    magnitudes.dealloc(8)
}

}

我希望他在我不在他的视野中时停止做 audioVibe.magnitudeArray = magnitudeArray 之类的事情,我该怎么办?

谢谢!

在您的 viewDidLoad 方法中,您正在创建一个 CADisplayLink 并将其添加到 运行 循环中。

如果您什么都不做,当您将另一个视图控制器推到它上面时,该显示 link 将保持活动状态。

您应该移动创建显示的代码 link 并将其添加到 运行 循环到您的 viewWillAppear 方法。

然后您需要在 viewWillDisappear 中添加代码,从 运行 循环中删除显示 link,使其无效,然后将其置零。

这样,您将在视图出现时开始显示 link 代码,并在视图消失时停止。

当您转换到不同的视图时,显示 link 似乎没有暂停。

您可以在离开此视图时暂停显示 link,并在返回此视图时使用 CADisplayLink 上的 paused 属性 恢复显示。您将在 viewWillDisappear 暂停它并在 viewWillAppear 恢复。