1

問題 : Core Data DB に保存されたパスを使用してテーブル ビューに画像をロードするプロセスは正常に機能しますが、ユーザー エクスペリエンスはうまくいきません。スクロールが遅くてバグがあります。

重要事項 :

  • ローカル DB にはCore Dataを使用します
  • 画像自体をコアデータに保存するのではなく、パス(画像名)のみを保存します
  • テーブル ビュー DataSource については、ID と Img 名 (TableView 行が array.Count に等しい) を含む型 Person の配列を使用します。-これは私のJsonを取得するURLです(チェックしてください) - Json Link
  • Core Data DB 内のすべてのオブジェクト
  • 私が知る限り、私はすべての UI アップデートをメイン シアターで行いました。
  • 各チェックの後、テーブルビューをリロードします。

これは、正しい順序で実行される手順です。

NSURLSession - DataTask を使用してデータを取得します。その後、それを「解析」し、各オブジェクト(forループ内)がCore Data DBに存在するかどうかを確認し、変数をTableViewデータソース配列に追加して、データをリロードします

1)

let request = NSMutableURLRequest(URL: dataSourceURL!)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
    data, response, error in

    if error != nil {
        println("error=\(error)")
        return
    }
    if data != nil {
        let datasourceDictionary = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil) as NSDictionary

        var  DataArray =  datasourceDictionary["descisions"] as NSArray

//Convert it to useable array

        for var i = 0 ; i < DataArray.count ; i++ {
            let ID_s = DataArray[i]["ID"]! as Int

//For each Object from the Json array i'm check if he is exisitng in the local DB
            var ConvertetdID = Int32(ID_s)
            let object : Lockdown? =        self.CheckIfObjectExistInDBbyID(ConvertetdID)

//CheckIfExists - if it does , it return an object with the correct values

            if  object != nil  {
                //exists - load file from Core Data
                let imgname = object!.imgPath
                let photoRecord = PhotoRecord(name:"\(ConvertetdID)", url:imgname)
                self.photos.append(photoRecord)

//TableView object array (photos)

                dispatch_async(dispatch_get_main_queue())  {
                self.tableView.reloadData()

//After each check reload the tableView   
            }
        }
    }
}
task.resume()

彼が Core Data DB に存在するかどうかを確認するメソッド (メソッドは ID を受け取り、存在する場合はオブジェクトを返し、存在しない場合は nil を返します。

 func CheckIfObjectExistInDBbyID(id : Int32) -> Lockdown? {
        let appDelegate =
        UIApplication.sharedApplication().delegate as AppDelegate

        let managedContext = appDelegate.managedObjectContext!
        var request : NSFetchRequest = NSFetchRequest(entityName: "Lockdown")
        request.predicate = NSPredicate(format: "id = %d", id)
        var error : NSError?
        request.fetchLimit = 1
        var count : Int = managedContext.countForFetchRequest(request,error: &error)
        if count == 0 {
           // println("Error : \(error?.localizedDescription)")
            println("Object \(id) Dosent exist in CoreData")

            return nil

        }
        println("Object \(id)  exist in CoreData")


        let result = managedContext.executeFetchRequest(request, error: &error) as NSArray!
        let lockdown = result.objectAtIndex(0) as Lockdown
        println(lockdown.id)
        return lockdown




    }

cellForRowAtIndexPath メソッド

 let cell = tableView.dequeueReusableCellWithIdentifier("CellIdentifier", forIndexPath: indexPath) as UITableViewCelllet photoDetails = photos[indexPath.row]





  cell.textLabel.text = photoDetails.name as String
      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
        var myPathList : NSArray = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true)

        var myPath = myPathList[0] as String
        myPath = myPath.stringByAppendingPathComponent("\(photoDetails.name).png")
        var image : UIImage = UIImage(contentsOfFile: myPath)!

        dispatch_async(dispatch_get_main_queue()) {

            cell.imageView.image = image
        }
    }

return cell

問題の原因は何ですか?

4

1 に答える 1