2017-01-27 4 views
0

프로파일이 컬렉션보기에 표시되는 앱에 스크린을 구현하고 있습니다. 내 데이터가 Firebase에서 검색되고 있으며 처음으로 Firebase DatabaseUI를 사용하고 있습니다.'Assertion Failure'Collection 다루는 방법 Swift에서 Firebase DatabaseUI의 충돌을 봅니까?

쿼리를 작성한 다음 FUICollectionViewDataSource을 만들고 셀을 큐에서 빼낸 다음 해당 데이터 소스를 collectionView에 연결합니다.

데이터 소스의 기능은 온라인과 오프라인 사용자 (쿼리에서 하위 키의 값을 확인) 사이를 전환하는 한 제대로 작동하지만 쿼리를 남성에서 여성으로 변경하면, 또는 여성을 남성에게 (새로운 쿼리 자체) 나는 NSInternalInconsistenencyException과 충돌합니다.

*** 인해 캐치되지 않는 예외 'NSInternalInconsistencyException'응용 프로그램 종료, 이유는 : '잘못된 업데이트 : 기존 섹션에 포함 된 항목의 수는 업데이트 후 섹션 0의 항목 개수가 잘못 것은 (1)해야한다 업데이트 (1) 이전에 해당 섹션에 포함 된 항목 수와 같거나, 해당 섹션 (삽입 된 1 개, 삭제 된 0 개)에 삽입되거나 삭제 된 항목 수를 더하거나 뺀 값 또는 빼거나 이동 한 항목 수를 더한 값 그 섹션 (0은 안으로 움직이고 0은 밖으로 움직였다). '

*** 먼저 투사 호출 스택 : (0x18672d1b8 0x18516455c 0x18672d08c의 0x1871e502c의 0x18cedc14c의 0x18c7b1d4c 0x10020f594 0x1002102c8 0x1001eb3e0 0x101609258 0x101609218 0x10160e280 0x1866da810 0x1866d83fc 0x1866062b8 0x1880ba198 0x18c64d7fc 0x18c648534 0x1000c4200 0x1855e95b8) 의 libC++ abi.dylib : 입력 NSException의 캐치되지 제외 종결 내가 수집 전망을 짓고 있어요 때

,이 같은 단지 실행 명령을 사용 해요 :

collectionView.dataSource = collectionViewDataSource 
self.collectionView.reloadData() 

하지만 위와 같은 호출은 작동하지 않으며 UICollectionViewDataSource 프로토콜 함수를 사용하지 않고 섹션 당 항목 수가 다른 새로운 쿼리를 만들고 실행하고 표시하는 방법을 잘 모르겠습니다.

이러한 종류의 충돌을 처리하지 않기 위해 새 쿼리를 처리하기 전에 실행해야하는 기능은 무엇입니까?

collectionview의 indexPathsForVisibleItems에서 모든 셀을 삭제하고 데이터를 다시로드하려고 시도했습니다 ... 주위에 collectionView.reloadData()을 던져 버렸지 만 여전히 충돌합니다. 항상 그렇진 않지만 앱이 조만간 충돌 할 것입니다.

collectionView에서 새로운 검색어를 시작하고 NSInternalInconsistencyExceptions을 처리하지 않으려면 어떻게해야합니까?

모두에게 감사드립니다. 나는 파이어베이스를 사랑하고 이것을 이해하고 싶다!

벤처로드가의 getUserData() 함수가 호출

-Reezy

. 쿼리가 변경되면 게시 된 알림에서 resetQuery() 함수가 실행됩니다.

extension BrowseVC { 
    func getUserData() { 
    let isOnline = (segmentedControl.selectedSegmentIndex == 0) ? true : false 
    generateQuery(isOnline: isOnline) 
    populateDataSource() 
    } 

    func resetQuery() { 
    removeOldData() 
    getUserData() 
    } 

    func removeOldData() { 
    let indexPaths = collectionView.indexPathsForVisibleItems 
    collectionView.deleteItems(at: indexPaths) 
// collectionView.reloadData() 
    } 

    func generateQuery(isOnline: Bool) { 
    if let selectedShowMe = UserDefaults.sharedInstance.string(forKey: Constants.ProfileKeys.ShowMe) { 
     let forMen = (selectedShowMe == Constants.ProfileValues.Men) ? true : false 
     query = FirebaseDB.sharedInstance.buildQuery(forMen: forMen, isOnline: isOnline) 
    } else { 
     query = FirebaseDB.sharedInstance.buildQuery(forMen: false, isOnline: isOnline) 
    } 
    } 

    func populateDataSource() { 
    if let query = query { 
     collectionViewDataSource = FUICollectionViewDataSource(query: query, view: collectionView, populateCell: { (view, indexPath, snapshot) -> ProfileCVCell in 
     if let cell = view.dequeueReusableCell(withReuseIdentifier: Constants.CollectionViewCellIdentifiers.ProfileCVCell, for: indexPath) as? ProfileCVCell { 
      if let userDictionary = snapshot.value as? [String: AnyObject] { 
      if let user = User(uid: snapshot.key, userDictionary: userDictionary) { 
       cell.populate(withUser: user) 
      } 
      } 

      return cell 
     } 
     return ProfileCVCell() 
     }) 

     collectionView.dataSource = collectionViewDataSource 
     collectionView.reloadData() 
//  collectionView.performBatchUpdates({ 
//  self.collectionView.dataSource = self.collectionViewDataSource 
//  }, completion: nil) 
//  collectionView.reloadData() 
    } 
    } 
} 
+0

질문을 업데이트하십시오. 데이터 소스 추가 및 위임 방법 – iMHitesh

답변

1

FirebaseUI 데이터베이스 데이터 소스는 컬렉션 뷰 자체에 업데이트를 푸시 할 책임이 있습니다. 이렇게하면 애니메이션 업데이트를 무료로 얻을 수 있으므로 reloadData를 호출 할 필요가 없습니다.

새 데이터 소스로 이전 데이터 소스를 스왑 아웃 할 때 데이터 소스의 콜렉션보기를 nil으로 설정하여 이벤트를 콜렉션보기로 푸시하는 것을 중지해야합니다.

+0

모건, 감사합니다. 정말 감사드립니다. // 오래된 데이터 소스를 공개하기위한 적절한 권장 방법이 있습니까? 설명서에서이 항목과 관련된 내용을 찾을 수 없습니다. 사용자의 갱신 된 검색 매개 변수와 정렬되지 않기 때문에 이전 데이터를 유지할 필요가 없습니다. – baQer

+0

'let indexPaths = collectionView.indexPathsForVisibleItems collectionView.deleteItems (at : indexPaths) collectionView.dataSource = nil' @Morgan 이렇게하면 내 데이터 소스를 지우려고했는데 불일치 예외로 인해 여전히 충돌이 발생합니다. – baQer

+0

데이터 원본을 지우려고 할 때 오류가 발생했습니다. 'NSInternalInconsistencyException'이라는 이유로 캐치되지 않은 예외로 인해 응용 프로그램을 종료하려고합니다. '콜렉션 뷰에 0 개의 항목 만있는 경우 글로벌 인덱스 9223372036854775807에 대한 인덱스 경로 요청' * ** 먼저 던져 호출 스택 : (0x1885091b8 0x186f4055c 0x18850908c 0x188fc102c 0x18e5907f0 0x18e5947b0 0x18e592cc8 0x18ecbb200 0x18e3cc7dc 0x18ecba230 0x18ecb82d0 0x18e58dd4c 0x1001ed9e0 0x1001ee714 0x1001c982c 0x1023c1258 0x1023c1218) 의 libC++ abi.dylib : 나는 문제를 제기합니다 NSException' – baQer