2016-06-29 6 views
-3

ViewController이 여전히 배열 업데이트를 보내는 중입니다. 다른보기에도 불구하고 무엇을 할 수 있습니까?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 같은 일을 그만 내가 원하는 : 여기 내 코드는?

감사합니다.

+1

어떤'viewWill ...'과'viewDid ...'함수를 사용해 보았습니까? – Wain

답변

0

viewDidLoad 메서드에서 CADisplayLink를 만들고 실행 루프에 추가하고 있습니다.

아무 것도하지 않으면 그 위에 다른보기 컨트롤러를 밀 때 해당 디스플레이 링크가 활성 상태를 유지합니다.

표시 링크를 만드는 코드를 이동하여 viewWillAppear 메서드의 실행 루프에 추가해야합니다.

그런 다음 실행 루프에서 표시 링크를 제거하고 무효화하고 제거하는 코드를 viewWillDisappear에 추가해야합니다.

그런 식으로보기가 나타나면 디스플레이 링크 코드를 시작하고보기가 사라지면 코드를 중지하십시오.

+0

runloop에서 어떻게 제거합니까? – BurningTurtle

+0

CADisplayLink에서 Xcode 문서를 살펴보십시오. 대답은 ** 분명히 ** 명백 할 것입니다. –

+0

또는 cjrieck이 지적한대로 디스플레이 링크를 그대로두고 잠시 멈출 수 있습니다. –

0

다른보기로 전환 할 때 링크가 일시 중지되지 않는 것처럼 보입니다.

paused 속성을 사용하여이보기로 전환 할 때 디스플레이 링크를 일시 중지하고이보기로 돌아올 때 재개 할 수 있습니다. viewWillDisappear에서 일시 중지하고 viewWillAppear에서 다시 시작하십시오.

관련 문제