2016-06-29 13 views
-3

mein ViewController sendet immer noch ein Array-Update, auch wenn ich in einer anderen Ansicht bin, was kann ich tun? Hier ist mein Code:Wie man ViewController in Swift stoppt?

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) 
} 

} 

Ich möchte, dass er Dinge wie audioVibe.magnitudeArray = magnitudeArray zu stoppen tun, während ich bin nicht in seiner Ansicht, was kann ich tun?

Danke!

+1

Welche 'viewWill ...' - und 'viewDid ...' -Funktionen haben Sie sich vorgenommen? – Wain

Antwort

0

In Ihrer ViewDidLoad-Methode erstellen Sie einen CADisplayLink und fügen ihn der Laufschleife hinzu.

Wenn Sie nichts tun, bleibt diese Anzeige aktiv, wenn Sie einen anderen View-Controller darüber schieben.

Sie sollten den Code, der die Anzeigeverbindung erstellt, verschieben und der Laufschleife zu Ihrer viewWillAppear-Methode hinzufügen.

Dann müssen Sie Code in ViewWillDisappear hinzufügen, der die Anzeigeverbindung aus der Ausführungsschleife entfernt, sie ungültig macht und ausschließt.

Auf diese Weise starten Sie Ihren Anzeige-Link-Code, wenn die Ansicht angezeigt wird, und stoppen Sie, wenn die Ansicht verschwindet.

+0

Wie entferne ich es aus dem Runloop? – BurningTurtle

+0

Werfen Sie einen Blick auf die Xcode-Dokumente auf CADisplayLink. Die Antwort wird ** schmerzlich ** offensichtlich sein. –

+0

Oder, wie cjrieck darauf hinweist, können Sie den Display-Link an Ort und Stelle lassen und ihn einfach anhalten. –

0

Sieht so aus, als ob die Anzeigeverbindung beim Übergang zu verschiedenen Ansichten nicht unterbrochen wird.

Sie können Ihre Anzeigeverbindung anhalten, wenn Sie von dieser Ansicht weggehen und sie fortsetzen, wenn Sie mit der paused-Eigenschaft unter CADisplayLink zu dieser Ansicht zurückkehren. Sie würden es in viewWillDisappear anhalten und in viewWillAppear fortsetzen.

Verwandte Themen