2017-03-07 6 views
2

아래 스 니펫에는 두 가지 문제가 있습니다.TableView 중복 및 파이어베이스 검색 쿼리

  1. 나는 내 TableView에 복제본을 가져 왔습니다.

    A :

  2. 나는 결과를 반환 뭔가를 검색하고 난 결과를 돌려 다른 일을 찾고 시도

  3. 는 기존의 결과는, 예를 들어하지 않는 새로운 결과를 보여주는 일이 될 것입니다. "ola"를 검색하면 TableView는 olabode, olatunde, olaide의 목록을 반환합니다.

    b. 그럼 "bisi"에 대한 검색, "bisi"에 대한 일치하는 쿼리를 찾을 경우 나는 여전히 "ola"에 대한 쿼리 결과를 얻을.

    func searchView(_ searchView: AZSearchViewController, didTextChangeTo text: String, textLength: Int) { 
        self.resultArray.removeAll() 
        searchView.reloadData() 
    
    guard text != "" else { 
        return 
    }  
        AppFirRef.userRef.queryOrdered(byChild: "username") 
         .queryStarting(atValue: text) 
         .queryEnding(atValue: text + "\\uf8ff") 
         .observe(.value, with: { (snapshot) in 
          if (snapshot.value is NSNull) { 
           print("not found") 
          } else { 
           print("found") 
           self.resultArray.removeAll() 
           searchView.reloadData() 
    
           print("\(snapshot.value)") 
           for case let snap as FIRDataSnapshot in snapshot.children { 
            guard let value = snap.value as? [String : Any] else { continue } 
            //print("\(snap.key)") 
            print(value) 
            let user = LContact(value: value, searchUserId: snap.key) 
            self.set.add(user) 
            if let username = user.username{ 
             self.resultArray.append(username.lowercased()) 
             searchView.reloadData() 
            } 
           } 
    
          } 
         }) 
    
    } 
    
+0

TableViewSource 새 데이터를 추가하기 전에? – apineda

+0

@apineda 예를 들어 복제가 발생했다는 것을 알았습니다. 두 개의 다른 장치를 사용하면 장치 A가 "사용자"노드에 추가되면 장치 B의 사용자 목록에 중복이 생깁니다. 중복이 사라지기 전에 장치 b를 다시 시작하십시오. 따라서 기본적으로 "사용자"노드가 다른 장치에서 참조되는 경우 내 쿼리가 중복됩니다. – SimpiMind

답변

1

그것은 너무 늦을 수 있지만

.observe(.value, with: { (snapshot) in 
... 
)} 

.observeSingleEvent(of: .value, with: { (snapshot) in 
... 
)} 

는 설명 this question에 내 대답을 참조 변경 될 수 있습니다; 참조 경로의 데이터가 변경 될 때마다 (예 : 다른 기기의 누군가가 userRef 참조 경로의 데이터를 변경하는 경우에도 배열에 추가되기 때문에 사용자에게도 적용됩니다.)