2017-05-21 12 views
0

web api JSONとからのコアデータに画像を保存できませんget_details?.logoは文字列データ型で、task.logoはコアデータのバイナリデータにあります自分のコードで何が問題なのかを直接知ることはできません資産からのイメージは動作しますが、JSON APIからは保存されません! bookmarktoCoredataこの問題が解決することができますどのようにイメージはWeb API JSON形式からCoreDataに保存されませんか?

func bookmarktoCoredata(){ 

    let alert = UIAlertController(title: "Add BookMark", message: "", preferredStyle: .alert) 
    let add = UIAlertAction(title: "Add", style: .default){ 
     (action) in 

     let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 
     let fetchId = ((self.get_details?.schoolid)!) 
     let bookmarkFetch: NSFetchRequest<Bookmark> = NSFetchRequest(entityName: "Bookmark") 
     bookmarkFetch.predicate = NSPredicate(format: "bookmark_id == %d", fetchId) 
     do { 
      let fetchedBookmarks = try context.fetch(bookmarkFetch) 
      // you should find 1 
      if fetchedBookmarks.count == 1 { 
       print("same id") 
      } else if fetchedBookmarks.count == 0 { 
       // There is no Bookmark with this id so create a new one 
       let task = Bookmark(context: context) 
       // Populate all the properties here and save 

       task.bookmark_id = Int16((self.get_details?.schoolid)!) 

       task.name = self.get_details?.name 
       task.address = self.get_details?.address 
       task.district = self.get_details?.district 
       task.country = self.get_details?.country 
       task.phone = self.get_details?.phone 
       task.email = self.get_details?.email 
       task.website = self.get_details?.website 
       task.institution = self.get_details?.institution_type 
       task.establishment = self.get_details?.establishment_date 
       task.admission_open = self.get_details?.admission_open_from 
       task.admission_end = self.get_details?.admission_open_from 
       task.latitude = (self.get_details?.latitude)! 
       task.longitude = (self.get_details?.longitude)! 
       task.bookmark_type = "school" 


       **if let imgdata = ((self.get_details?.logo)){ 
       task.logo = (UIImage(named: imgdata)) as NSData 

       }** 




       (UIApplication.shared.delegate as! AppDelegate).saveContext() 


       // Populate all the properties here and save 
      } else { 
       // If you get here you have more than one with the same id. Fix error 
      } 
     } catch { 
      fatalError("Failed to fetch bookmark: \(error)") 
     } 


} 

FUNC

+0

「get_details?.logo」という文字列の例を挙げてください。 –

+0

get_details?.logo JSON APIからのモデルクラスの文字列データ型で、そのデータをバイナリデータのコアデータに保存する必要があります。@JonRose –

+0

サーバーから取得する文字列を使用する方法(つまり、UIImage(名前:imgdata ) ')あなたがバンドル内のパスを参照するような文字列(例えば' logo1.png'のようなもの)を期待しているようですが、それについて話をすると、base64データのように見えます。 –

答えて

0

一般に、イメージデータをコアデータに保存することは悪い習慣です。そのような大量のデータを管理するのはデータベースではありません。ファイルシステムははるかに良い選択です。属性を別々のファイルとして格納するようにコアデータを設定することもできますが、この場合はもっと良い解決策があります。

そのままURLをコアデータ:task.logo = self.get_details?.logoに保存し、表示する必要がある場合にのみダウンロードしてください。 SDWebimageを使用することをお勧めします。それを表示する必要があるときは、imageView.sd_setImage(with: URL(string: task.logo), placeholderImage: UIImage(named: "placeholder.png"))のようにimageViewにURLをロードします。

これには多くの利点があります:1)必要な場合のみ画像を読み込みます。2)アプリケーションのtmpディレクトリにダウンロードした画像をキャッシュします。 )。 3)より透明な方法でダウンロード時間も処理します。プレースホルダ画像を設定するか、より制御したい場合は、より複雑なSDWebimageメソッドを使用できます。

+0

おかげで多くの先生、今、あなたからこの知識を得ました。それは将来も私を助けてくれるでしょう..ハッピーコーディング.. !!! –

関連する問題