2017-08-02 5 views
1

コアデータを使用して2種類のアレイを保存しようとしています。一方の配列にはUIimageが含まれ、もう一方の配列にはURLの動画が含まれます。以下の方法で正常に保存できます。アプリケーションコアデータからデータをフェッチしようとするとクラッシュします

let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    let context = appDelegate.persistentContainer.viewContext 
    let newVideo = NSEntityDescription.insertNewObject(forEntityName: "Content", into: context) 
    videosArray.append(session.outputURL!) 
    let thumbnail = self.getThumbnail(session.outputURL!) 
    thumbnails.append(thumbnail) 
    newVideo.setValue(videosArray, forKey: "videos") 
    newVideo.setValue(thumbnails, forKey: "thumbnails") 

    do { 

     try context.save() 
     print("Save") 

    } catch { 
     print("Error") 
     // Process error 
    } 

保存メッセージが表示されます。しかし、コレクションビューでそれらをロードしようとするとクラッシュします。

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    let context = appDelegate.persistentContainer.viewContext 

    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Content") 
    request.returnsObjectsAsFaults = false 

    do { 
     let results = try context.fetch(request) 
     if results.count > 0 { 
      for result in results as! [NSManagedObject] { 
       if let fetchedThumbnails = (result).value(forKey: "thumbnails") as? Array<Any> { 
        return fetchedThumbnails.count 
       } 
      } 
     } 
    } catch { 
     print("There was a crash fetching content") 
    } 

    return 0 
} 

コレクションビューは、配列内にあるサムネイル数を返すことになっています。しかし、それはクラッシュし、アプリケーションデリゲートファイルに私を連れて行く。

私は

let results = try context.fetch(request) 

にブレークポイントを設定し、それがブレークポイントになります。

は、私は

if results.count > 0 { 

とアプリのクラッシュで別のブレークポイントを設定し、このエラーでアプリデリゲートに私を取る:

Terminating app due to uncaught exception 
'NSInvalidArgumentException', 
reason: '-[Content initWithCoder:]: 
unrecognized selector sent to instance 0x174a6d840' 

Image of how I Declare Entity

+1

「Content」型の宣言を追加できますか? –

+0

コアデータファイルに宣言したらどういう意味ですか? –

+0

@ NandiinBao画像を追加しました –

答えて

1

は、あなたがに準拠する必要があります。 ContentエンティティのNSCodingプロトコル。 これを行うには、次の2つの方法を実装する必要があります。

required init?(coder aDecoder: NSCoder) { 

} 

func encodeWithCoder(aCoder: NSCoder) { 
} 
+0

これを行う方法を教えてもらえますか?コアデータを使用するのは初めてのことです –

関連する問題