2016-10-20 17 views
-1

Firebase를 사용하는 응용 프로그램에서 작업하고 있습니다. 내가 성취하고자하는 것은 Firebase에서 데이터를 가져 와서 그 데이터를 정렬 한 다음 마침내 한 번 완료된 데이터를 tableView에로드하는 것입니다.데이터 가져 오기, 데이터 정렬, 테이블보기로로드 (Swift 3 : Firebase)

은 그럴 거 주 내 전체 코드를 해요,하지만 여기에 내가 그것을 작동하는 방법을 근본적으로이다 : print("Test")가 불려 가도록 ...

var posts = [PostStruct]() 
var following = [String]() 

let databaseRef = FIRDatabase.database().reference() 
for follower in following { 
    databaseRef.child("Posts").child(follower).observe(.value, with: { 
     DataSnapshot in 
      //Parse All The Data... 

      self.posts.insert(...) 

     } 
} 
self.posts.sort{$0.date.compare($1.date) == .orderedDescending} 

print("Test") 

self.tableView.reloadData() 

하지만 불려갑니다 FIRDatabase가 요청되기 전에 정렬 할 때 tableView에 데이터가 전혀 없다는 것을 알 수 있습니다. 그래서, 일단 데이터베이스가 요청을 마친 후에 만 ​​정렬하는 방법을 찾아야합니다.

for 문에 sort 및 reload 메서드를 넣을 수는 있지만 작동하지만 고르지 않은 것을 모두로드합니다. 그리 효율적이지 않습니다.

답변

2

이 문제를 해결하는 가장 좋은 방법인지 잘 모르겠지만 증가 된 카운터를 추가 한 다음 해당 카운터가 다음 배열의 개수와 같으면 정렬 및 다시로드 코드를 실행할 수 있습니다. 이것이 당신의 유튜브 튜토리얼 경우

var counter = 0 

let databaseRef = FIRDatabase.database().reference() 
for follower in following { 
    databaseRef.child("Posts").child(follower).observe(.value, with: { 
     DataSnapshot in 
     //Parse All The Data... 

     counter += 1 

     self.posts.insert(...) 

     if counter == following.count { 
      self.sortPosts() 
     } 
    } 
} 

func sortPosts() { 
    self.posts.sort{$0.date.compare($1.date) == .orderedDescending} 

    print("Test") 

    self.tableView.reloadData() 
} 
+0

고마워요! 나는 실제로 그 생각을 염두에두고 있었지만, 제대로 생각하지 않았습니다. 도와 주셔서 감사합니다! 너는 생명의 은인이야. :) –

+0

대부분 환영합니다. 그 순간도 있었어. 기꺼이 도와주세요. 나는 콜백 함수에 대해서도 @Pentarex 제안을 좋아한다. 나는 그 해결책이 조금 더 우아해 보일 것이라고 오랫동안 생각한다. – Donny

+0

그래, 나는 그 사실을 명심해야한다. :) –

1

나는


내가 도니의 솔루션이 작동 할 거라고 생각 대답하려고 할 것이다 당신은 콜백 함수

func getData(handle:@escaping ((Bool) -> Void)){ 
    let databaseRef = FIRDatabase.database().reference() 
    for follower in following { 
    databaseRef.child("Posts").child(follower).observe(.value, with: { 
     DataSnapshot in 
    //Parse All The Data... 

     counter += 1 

     self.posts.insert(...) 

     if counter == following.count { 
     handle(true) 
     } 
    } 
    } 
} 
와도 그것을 할 수 있습니다

그리고 getData를 호출하는 메소드에서.

getData(){ ready in 
    self.posts.sort{$0.date.compare($1.date) == .orderedDescending} 

    print("Test") 

    self.tableView.reloadData() 
} 
+0

하하, 나를 알아 줘서 고마워. 이것은 실제로 개인 프로젝트와 YouTube 모두를위한 것입니다. :) –

+0

콜백 함수를 제안 해 주셔서 감사합니다. 도니가 나를 위해 그것을 해결했습니다. :) –

관련 문제