2014-12-18 3 views
0

Firebase를 사용하여 데이터를 저장하고 있으며 클로저를 사용하여 데이터를 검색하려고 할 때 클로저가 끝나기 전에 항상 끝나고 돌아갑니다. 내 HeyUser 클래스에서 내 Firebase에서 Friend 키의 값을 가져 와서 클래스 속성에 저장하려고합니다. 그러나 클래스의 객체를 인스턴스화하려고하면 객체는 프렌드 키 값을 가져 오지 않고 인스턴스화됩니다. 폐쇄가 완료 될 때까지 인스턴스화 또는 함수 완료를 지연시킬 수 있는지 궁금합니다. 다음은 내 HeyUser 클래스의 코드입니다 :클로저가 완료되기 전에 함수가 돌아옵니다. Firebase

class HeyUser { 
var Friends: [String] = [String]() 
var username = PFUser.currentUser().username 
var ref = Firebase() 
var fRef = Firebase() 

init() { 
    self.ref = Firebase(url: "https://hey-chat.firebaseio.com/").childByAppendingPath("users").childByAppendingPath(PFUser.currentUser().username) 
    self.fRef = self.ref.childByAppendingPath("friends") 
    self.getFriends() 
} 

func getFriends() { 
    self.fRef.observeSingleEventOfType(.Value, withBlock: { snapshot in 
     self.Friends = snapshot.value as [String] 
     print("TEST") 
     print(self.Friends.count) 
     }) 
} 

}

+0

관련 : http://stackoverflow.com/questions/27338575/force-asynchrounous-firebase-query-to-execute-synchronously/27345823#27345823 –

답변

1

내가 중포 기지에 대해 잘 알고, 여전히 스위프트 시작하기 모르겠지만, 어떻게 네트워킹 작품 비동기이 있음을 알 수 있습니다.

함수를 호출하고 블록을 전달합니다 (클로저). 이 함수는 즉시 반환하고 나중에 네트워크 트랜잭션이 완료되면 프레임 워크 (이 경우 firebase)가 클로저를 호출합니다.

이 아키텍처를 사용하면서 생각을 바꾸어야합니다. 요청을 보내기 위해 코드를 작성한 다음 요청이 완료되기를 기다리면서 "대기 모드"로 들어갑니다.

+0

그래, 내가 이해하지만, 대기 모드. obj에서이 작업을 수행하는 방법을 알고 있다면 괜찮습니다. 신속하게 변환 할 수 있습니다. 감사합니다. – user2464778

+0

당신은 단지 당신의 앱이 사용자로부터의 입력을 기다리는 상태로 돌아 가게 할 것입니다. 첫 번째 요청이 완료되기 전에 사용자가 동일한 요청을 다시 보내지 못하게하는 코드를 추가해야하며, 현재 트랜잭션을 먼저 취소하지 않으면 현재 요청이 실패하게 만드는 다른 작업을 수행하지 못하게 할 수 있습니다. 세부 사항은 앱에 따라 다르므로 구체적인 정보를 제공하기가 어렵습니다. –

관련 문제