2016-10-15 12 views
1

から画像をロードするとき、私はそのようにようcoreDataに保存されている私のサーバーからいくつかの写真をダウンロード(私はこのチュートリアルの後:Saving Picked Image to CoreData)をクラッシュ私は私のアプリを起動するとcoreData

extension NewsFeedViewController { 



    func getContext() { 
     saveQueue.sync { 


     let appDelegate = UIApplication.shared.delegate as! AppDelegate 
     self.managedContext = appDelegate.persistentContainer.viewContext 
     } 
    } 
} 

extension NewsFeedViewController { 

    func prepareImageForSaving(image:UIImage) { 

     // use date as unique id 
     let date : Double = NSDate().timeIntervalSince1970 

     // dispatch with gcd. 
     convertQueue.async() { 
      print("dd") 
      // create NSData from UIImage 
      guard let imageData = UIImageJPEGRepresentation(image, 1) else { 
       // handle failed conversion 
       print("jpg error") 
       return 
      } 


      // scale image, I chose the size of the VC because it is easy 


      // send to save function 
      self.saveImage(imageData: imageData as NSData, date: date) 

     } 
    } 
} 

extension NewsFeedViewController { 

    func saveImage(imageData:NSData, date: Double) { 


     saveQueue.async(flags: .barrier) { 

      // create new objects in moc 
      guard let moc = self.managedContext else { 

       return 
      } 

      guard let fullRes = NSEntityDescription.insertNewObject(forEntityName: "Blogger", into: moc) as? FullRes else { 
       // handle failed new object in moc 
       print("moc error") 
       return 
      } 

      //set image data of fullres 
      fullRes.imageData = imageData as Data 


      // save the new objects 
      do { 

       try moc.save() 

      } catch { 
       fatalError("Failure to save context: \(error)") 
      } 

      // clear the moc 
      moc.refreshAllObjects() 
     } 

    } 

} 


extension NewsFeedViewController { 

    func loadImages(_ fetched:@escaping (_ images:[FullRes]?) -> Void) { 

     saveQueue.async() { 
      guard let moc = self.managedContext else { 
       return 
      } 

      let fetchRequest :NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "FullRes") 
      //let fetchRequest = NSFetchRequest(entityName: "FullRes")//NSFetchRequest(entityName: "FullRes") 
      print(fetchRequest) 

      do { 

       let results = try moc.fetch(fetchRequest) 
       let imageData = results as? [FullRes] 
       DispatchQueue.main.async() { 
        fetched(imageData) 

       } 
      } catch let error as NSError { 
       print("Could not fetch \(error), \(error.userInfo)") 
       return 
      } 
     } 
    } 

} 

そのコードでは I保存するイメージを準備しています。それを保存してから、コードの他の部分(ここには掲載されていません)とインターネット接続があるかどうかを確認します。画像がロードされていない場合は、上記のloadImages()関数を呼び出します。それを呼び出すとき

は、私はこのエラーを取得する:誰もこれで私を助けることができるならば、それははるかに

enter image description here

を高く評価しています!

答えて

1

私はあなたのコードには問題はありません。この

let fetchRequest: NSFetchRequest<NSFetchRequestResult> = FullRes.fetchRequest() 
0

let fetchRequestを変更しました。私はあなたの正確なコードを実装しており、それは完全に動作しています。これで、問題を切り分けようとしています。ログインしているユーザーを処理する機能や一般的なコンテンツをダウンロードする機能のような、インターネットを使用している機能をコメントするようにしてください。

また、AppDelegateがインターネットなしでアプリケーションを起動すると、早期クラッシュを引き起こす可能性のある機能について確認してください。

到達可能性がないために発生した例外を常にキャッチしようとします。

if Reachability.isConnectedToNetwork() == true { 
    //execute your code 
} else { 
    //catch print 
} 
:によって呼び出され

import Foundation 
import SystemConfiguration 

open class Reachability { 

    class func isConnectedToNetwork() -> Bool { 

     var zeroAddress = sockaddr_in() 
     zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress)) 
     zeroAddress.sin_family = sa_family_t(AF_INET) 

     guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress , { 
      $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in 
       SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress) 
      } 
     }) else { 
      return false 
     } 

     var flags : SCNetworkReachabilityFlags = [] 
     if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) { 
      return false 
     } 

     let isReachable = flags.contains(.reachable) 
     let needsConnection = flags.contains(.connectionRequired) 
     return (isReachable && !needsConnection) 
    } 

} 

その目的のために、私は次の関数を使用してい

関連する問題