无法对非收集对象执行收集评估

时间:2019-02-03 22:12:19

标签: swift core-data nsorderedset

当我执行segue时,我会将所有季节从选定的节目传递到下一个ViewController。

class ShowsViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Request Items with type = Movie
        let request: NSFetchRequest<TelevisionShow> = TelevisionShow.fetchRequest()
        allShows = try! CoreDataStack.context.fetch(request)
        allShows = allShows.sorted(by: { $0.title! <  $1.title! })
    }

    @IBOutlet private weak var collectionView: UICollectionView!
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

        // Create a variable that you want to send based on the destination view controller

        selectedShow = allShows[indexPath.item]

        // This will perform the segue and pre-load the variable for you to use
        self.performSegue(withIdentifier: "toSeasonsViewController", sender: self)

    }

如果我尝试使用NSPredicate进行获取请求,则会崩溃。 (2019-02-04 11:10:48.766456 + 0100 TV [16295:659978] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Can't perform collection evaluate with non-collection object.')

class SeasonsViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let request: NSFetchRequest<Season> = Season.fetchRequest()
        request.returnsObjectsAsFaults = false
        request.predicate = NSPredicate(format: "SUBQUERY(televisionShow, $m, ANY $m.seasons IN %@).@count > 0",(pTelevisionShow?.seasons)!)

        allSeasons = try! CoreDataStack.context.fetch(request)
        allSeasons = allSeasons.sorted(by: { $0.number! <  $1.number! })
    }

    @IBOutlet private weak var collectionView: UICollectionView!

    var pTelevisionShow: TelevisionShow?
}

xcdatamodeld 问题在于,我第一次选择电视节目并执行segue时,效果很好,如果我回头选择另一个电视节目,则会抛出该错误。

+

class AppDelegate: UIResponder, UIApplicationDelegate { Thread 1: signal SIGABRT

libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

pTelevisionShow?.seasons是NSOrderedSet

xcdatamodeld 解决方案:

allSeasons = pTelevisionShow?.seasons!.sorted(by: { ($0 as! Season).number! < ($1 as! Season).number! }) as! [Season]

1 个答案:

答案 0 :(得分:0)

  

***由于未捕获的异常“ NSInternalInconsistencyException”而终止应用程序,原因:“无法对非收集对象执行收集评估。”

看起来您的谓词返回的是单个对象,而不是对象的集合。

因此您的谓词逻辑NSPredicate(format: "SUBQUERY(televisionShow, $m, ANY $m.seasons IN %@).@count > 0",(pTelevisionShow?.seasons)!)由于某种原因返回单个元素。

但是,在您的情况下,由于您向前传递pTelevisionShow,因此您的结构已经引用了所需的seasons数据集并且可以直接访问,因此您不需要{{ 1}}再次在fetchRequest上。


删除以下代码:

Season

更改并保留:

let request: NSFetchRequest<Season> = Season.fetchRequest()
request.returnsObjectsAsFaults = false
request.predicate = NSPredicate(format: "SUBQUERY(televisionShow, $m, ANY $m.seasons IN %@).@count > 0",(pTelevisionShow?.seasons)!)