首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用领域和NSInternalInconsistencyException来预防UICollectionView

如何用领域和NSInternalInconsistencyException来预防UICollectionView
EN

Stack Overflow用户
提问于 2016-09-27 17:28:07
回答 2查看 1.2K关注 0票数 2

我有一个从领域填充的UICollectionView。有些用户,似乎是随机的,得到了一个NSInternalInconsistencyException,声明如下

无效更新:第0节中的项目数无效。更新(73)后一个现有节中包含的项目数必须等于更新(73)之前该节中所包含的项目数,加上或减去从该节插入或删除的项目数(1插入,0删除),加上或减去移入或移出该节的项目数(0移动,0移出)。

我的代码基于王国的集合示例。它选择并过滤一些记录:

self.assets = realm.objects(Asset.self).filter("is_deleted = false")

然后它订阅并处理通知:

代码语言:javascript
运行
复制
self.assetsNotificationToken = self.assets!.addNotificationBlock(){ [weak self] (changes: RealmCollectionChange) in

    guard let collectionView = self!.collectionView else { return }

    guard let strongSelf = self else { return }

    switch changes {

        case .Initial:

            collectionView.reloadData()

        case .Update(let _, let deletions, let insertions, let modifications):

            strongSelf.collectionView?.performBatchUpdates({

                collectionView.insertItemsAtIndexPaths(insertions.map { NSIndexPath(forRow: $0, inSection: 0) })

                collectionView.reloadItemsAtIndexPaths(modifications.map { NSIndexPath(forRow: $0, inSection: 0) })

                collectionView.deleteItemsAtIndexPaths(deletions.map { NSIndexPath(forRow: $0, inSection: 0) })

            }, completion: nil)

        case .Error(let error):

            log.error(error.localizedDescription)
            break

    }

}

这一数字来自:

代码语言:javascript
运行
复制
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    guard assets != nil else {
        return 0;
    }

    return assets!.count

}

I后来切换到 RealmGridController

由于找不到坠机的原因,我切换到RealmGridController。它是一个由领域核心贡献者编写的包,它封装了使用王国+ CollectionViews所需的所有标准功能。

它似乎起作用了,然后我开始看到完全相同的碰撞。

致命异常: NSInternalInconsistencyException无效更新: 0节中的项目数无效。更新(78)后一个现有节中包含的项目数必须等于更新(78)之前该节中所包含的项目数,加上或减去从该节插入或删除的项目数(2插入,0删除),加上或减去移入或移出该节的项目数(0移动,0移出)。

代码语言:javascript
运行
复制
Fatal Exception: NSInternalInconsistencyException
0  CoreFoundation                 0x1839dadb0 __exceptionPreprocess
1  libobjc.A.dylib                0x18303ff80 objc_exception_throw
2  CoreFoundation                 0x1839dac80 +[NSException raise:format:]
3  Foundation                     0x184360154 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:]
4  UIKit                          0x18938b00c -[UICollectionView _endItemAnimationsWithInvalidationContext:tentativelyForReordering:]
5  UIKit                          0x18938e464 -[UICollectionView _performBatchUpdates:completion:invalidationContext:tentativelyForReordering:]
6  UIKit                          0x18938e2e0 -[UICollectionView _performBatchUpdates:completion:invalidationContext:]
7  UIKit                          0x188d2c2a4 -[UICollectionView performBatchUpdates:completion:]
8  RealmGridController            0x1014a8340 specialized RealmGridController.controllerDidChangeContent(RBQFetchedResultsController) -> () (RealmGridController.swift:316)
9  RealmGridController            0x1014a687c @objc RealmGridController.controllerDidChangeContent(RBQFetchedResultsController) -> () (RealmGridController.swift)
10 RBQFetchedResultsController    0x100ff8edc __112-[RBQFetchedResultsController calculateChangesWithAddedSafeObjects:deletedSafeObjects:changedSafeObjects:realm:]_block_invoke.433 (RBQFetchedResultsController.m:842)
11 libdispatch.dylib              0x1834254bc _dispatch_call_block_and_release
EN

Stack Overflow用户

发布于 2016-10-12 09:24:48

在我的情况下,我有一个拉力刷新和无限负荷下降。

当我想刷新时,我正在删除所有对象,以便在web服务调用之前获得新的新数据。

代码语言:javascript
运行
复制
try! Realm().write {
    let demands = Realm().objects(Demand.self)
    for demand in demands {
        Realm().delete(demand)
    }
}

它触发了更改通知,但在有时间执行删除动画之前,我收到了带有一个新项的web服务的响应,即创建NSInternalInconsistencyException

所以我试着:

代码语言:javascript
运行
复制
try! Realm().write {
    let demands = Realm().objects(Demand.self)
    for demand in demands {
        Realm().delete(demand)  
    }
}
collectionView?.reloadData()

但没起作用。最后我做了:

代码语言:javascript
运行
复制
try! Realm().write {
    let demands = Realm().objects(Demand.self)
    for demand in demands {
        Realm().delete(demand)
        collectionView?.reloadData()
    }
}

而且起作用了!这样做的目的是在调用通知之前对reloadCollectionView进行访问。希望能帮上忙。

注意:我在模拟器上没有任何问题,只有在真正的iPhone 6设备iOS 10上。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39730887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档