Не удается выполнить оценку коллекции с не-коллекционным объектом - PullRequest
0 голосов
/ 04 февраля 2019

Когда я выполняю 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 Проблема заключается в том, что я выбираю впервыеtvshow и выполнить segue, он работает хорошо, если я вернусь и выберу другой tvshow, он выдаст эту ошибку.

+

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 голосов
/ 04 февраля 2019

*** Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Невозможно выполнить оценку коллекции с объектом, не являющимся коллекцией.»)

Похоже, ваш предикатвозвращение одного объекта, а не коллекции объектов.

Итак, ваша логика предиката NSPredicate(format: "SUBQUERY(televisionShow, $m, ANY $m.seasons IN %@).@count > 0",(pTelevisionShow?.seasons)!) по какой-то причине возвращает один элемент.

Однако, в вашем случае, так как вы передаетеpTelevisionShow forward, ваша структура уже имеет ссылку на требуемый набор данных 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: { $0.number! < $1.number! })
...