无法使用非集合对象执行集合评估
Can't perform collection evaluate with non-collection object
当我执行 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: { [=10=].title! < .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 电视[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: { [=11=].number! < .number! })
}
@IBOutlet private weak var collectionView: UICollectionView!
var pTelevisionShow: TelevisionShow?
}
问题是我第一次选择一个电视节目并执行 segue 时,它运行良好,如果我返回并选择另一个电视节目,它会抛出该错误。
+
class AppDelegate: UIResponder, UIApplicationDelegate { Thread 1: signal SIGABRT
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
pTelevisionShow?.seasons 是 NSOrderedSet
解决方案:
allSeasons = pTelevisionShow?.seasons!.sorted(by: { ([=13=] as! Season).number! < ( as! Season).number! }) as! [Season]
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Can't perform collection evaluate with non-collection object.')
看起来您的谓词返回的是单个对象而不是对象集合。
因此您的谓词逻辑 NSPredicate(format: "SUBQUERY(televisionShow, $m, ANY $m.seasons IN %@).@count > 0",(pTelevisionShow?.seasons)!)
出于某种原因返回单个元素。
但是,在您的情况下,由于您要向前传递 pTelevisionShow
,您的结构已经引用了所需的 seasons
数据集并且可以直接访问,因此您不需要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)!)
更改并保留:
allSeasons = pTelevisionShow?.seasons.sorted(by: { [=11=].number! < .number! })
当我执行 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: { [=10=].title! < .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 电视[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: { [=11=].number! < .number! })
}
@IBOutlet private weak var collectionView: UICollectionView!
var pTelevisionShow: TelevisionShow?
}
+
class AppDelegate: UIResponder, UIApplicationDelegate { Thread 1: signal SIGABRT
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
pTelevisionShow?.seasons 是 NSOrderedSet
allSeasons = pTelevisionShow?.seasons!.sorted(by: { ([=13=] as! Season).number! < ( as! Season).number! }) as! [Season]
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Can't perform collection evaluate with non-collection object.')
看起来您的谓词返回的是单个对象而不是对象集合。
因此您的谓词逻辑 NSPredicate(format: "SUBQUERY(televisionShow, $m, ANY $m.seasons IN %@).@count > 0",(pTelevisionShow?.seasons)!)
出于某种原因返回单个元素。
但是,在您的情况下,由于您要向前传递 pTelevisionShow
,您的结构已经引用了所需的 seasons
数据集并且可以直接访问,因此您不需要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)!)
更改并保留:
allSeasons = pTelevisionShow?.seasons.sorted(by: { [=11=].number! < .number! })