2016-09-10 12 views
0

私は、フォームに記入してライブラリからイメージを設定し、ディレクトリに格納する状況があります。 ディレクトリから画像を取得できますが、スクロールの途中でtableviewリストがちらつきますので、私はdispatch_asyncの方法で作業していますができません。ディレクトリからスウィッチ非同期ロードイメージ

誰かが解決策を持っている場合は、私に知らせてください。

ここに私のコードです。

import UIKit 

func getDocumentsURL() -> NSURL { 
    let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] 
    return documentsURL 
} 

func fileInDocumentsDirectory(filename: String) -> String { 

    let fileURL = getDocumentsURL().URLByAppendingPathComponent(filename) 
    return fileURL.path! 

} 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{ 

    var marrEmpData : NSMutableArray! 
    @IBOutlet var MyTable: UITableView! 
    @IBAction func addEmpInfo(){ 

    } 

    override func viewWillAppear(animated: Bool) { 
     self.getStudentData() 
    } 

    func getStudentData() 
    { 
     marrEmpData = NSMutableArray() 
     marrEmpData = ModelManager.getInstance().getAllStudentData() 
     MyTable.reloadData() 
    } 



    override func viewDidLoad() { 
     super.viewDidLoad() 
     MyTable.delegate = self 
     MyTable.dataSource = self 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ 
     //return names.count; 
     return marrEmpData.count; 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     let cell:CustomCell = self.MyTable.dequeueReusableCellWithIdentifier("cells") as! CustomCell 

     let emp:EmpInfo = marrEmpData.objectAtIndex(indexPath.row) as! EmpInfo 

     let randomNum = "Image-\(indexPath.row+1).png" 

     let imagePathOne = fileInDocumentsDirectory(randomNum) 





     dispatch_async(dispatch_get_main_queue()) { 
      if let loadedImage = self.loadImageFromPath(imagePathOne) { 
       print("view Loaded Image: \(loadedImage)") 
       cell.photo.image = loadedImage 
      } 
      else { 
       cell.photo.image = UIImage(named: "default_user") 
      } 
     } 

     // user profile 
     cell.name.text = emp.full_name 
     cell.age.text = emp.age 
     cell.phone.text = emp.phone 


     return cell 
    } 



    // which one is tapped 
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     print("You tapped cell number \(indexPath.row).") 
    } 

    // load image of user 
    func loadImageFromPath(path: String) -> UIImage? { 
     print("image-----\(path)") 
     let image = UIImage(contentsOfFile: path) 

     if image == nil { 

      print("missing image at: \(path)") 

     } 


     print("Loading image from path: \(path)") // this is just for you to see the path in case you want to go to the directory, using Finder. 
     return image 
    } 

} 

答えて

0

あなたはdispatch_asyncを使用しているが、あなたはあなたがすでにあるスレッドであるメインキューに派遣されています。バックグラウンドスレッドにディスパッチし、イメージをロードしてからメインスレッドにディスパッチし、UIを更新する必要があります。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) 
{ 

    let image = self.loadImageFromPath(imagePathOne) 

    dispatch_async(dispatch_get_main_queue()) 
    { 
     if let loadedImage = image 
     { 
      print("view Loaded Image: \(loadedImage)") 
      cell.photo.image = loadedImage 
     } 
     else 
     { 
      cell.photo.image = UIImage(named: "default_user") 
     } 
    } 

} 
関連する問題