2016-10-01 2 views
0

Firebase에서 사용자 데이터를 가져와 필요한 경우 현재 화면을 업데이트하는 매우 기본적인 사용자 클래스가 있습니다. 프로젝트를 업데이트하기로 결정할 때까지 모든 것이 작동했습니다.Swift 2.3에서 Swift 3.0으로 업데이트 한 후 클래스 프로토콜이 작동하지 않음

class FirstViewController: UIViewController, userClassProtocol { 
    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     print("View will load") 
     User.sharedInstance.delegate = self 
    } 

    func updateScreen() { 
     print("Screen is going to update") 
     //Do stuff here 
    } 
} 

내가이에서 얻을 로그는 다음과 같습니다 : 스위프트 3.0

에 이것은의 ViewController 사용자 클래스

@objc protocol userClassProtocol { 
     func updateScreen() 
     @objc optional func sucessUnlockedCategory() 
    } 

class User { 
    static let sharedInstance = User() 
    internal var delegate : userClassProtocol? 

    func fakeClassThatGetsDataFromFirebase() { 
     //Got data 
     print("Has new data") 
     self.delegate?.updateScreen() 
    } 
} 

입니다 그리고 여기 새로운 데이터 있음 보기가 나타납니다

그러나 뷰 컨트롤러의 updateScreen() 함수는 결코 호출되지 않습니다. Xcode는 오류를 지적하지 않습니다.

+0

위임을 설정 한 후 fakeClassThatGetsDataFromFirebase를 호출합니까? –

답변

1

메소드 호출 타이밍과 관련된 문제인 것처럼 보입니다.

fakeClassThatGetsDataFromFirebase 메서드가 먼저 호출되고 그 시점에서 대리자가 설정되지 않았습니다. 호출 할 때 그래서 self.delegatenil이다 : 당신의 viewWillAppear이가 호출되지해야 fakeClassThatGetsDataFromFirebase

+0

당신은 무언가에, 나는 그 함수를 호출하기 전에 User.sharedInstance.delegate = self를 호출하기 위해 fakeClassThatGetsDataFromFirebase를 트리거하는 버튼의 코드를 변경했다. 그리고 그것은 똑같은 코드가 작동하기 전에 (Swift 2.3), 이론적으로 viewWillAppear은 매번 fakeClassThatGetsDataFromFirebase 전에 호출됩니다. –

+0

귀하의 스위프트 3 전환에있는 다른 어떤 것들이 어떻게 불려지는 순서로 엉망이 될 수 있다고 생각합니다. 아마도 당신은 위임자를'FirstViewController'의 init 메소드로 옮기거나 적어도 호출 체인을'viewDidLoad'로 옮겨야합니다. – kleezy

+0

이것이 사물의 바닥에 도달하는 데 도움이 되었습니까? 그렇다면 대답을 수락하십시오. – kleezy

0

전에 호출되는 경우

self.delegate?.updateScreen()

이것은 단지 당신의 코드에 따라 작동합니다. 어떤 전화도 으로 전화를 걸지 않습니다. 이는 대리자 방법에서 updateScreen()이라고해야합니다.

+0

fakeClassThaGetsDataFromFirebase는 Firebase 데이터베이스 데이터가 변경 될 때마다 호출됩니다. 크기가 커서 코드를 넣지 않았지만 함수 안에있는 프린트 ("새 데이터 있음")를 얻었습니다. –

관련 문제