2016-09-10 6 views
0

Ich habe eine Situation, wo ich ein Formular ausfüllen und Bild aus der Bibliothek dann in einem Verzeichnis speichern. Ich kann Bild aus dem Verzeichnis aber tableview Liste flackern in der Mitte der Bildlauf, so dass ich mit der Methode dispatch_async arbeiten kann, aber nicht in der Lage zu tun.Schnelle asynch laden Bild aus dem Verzeichnis

Wenn jemand eine Lösung hat, lass es mich wissen.

Hier ist mein Code.

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 
    } 

} 

Antwort

0

Sie verwenden dispatch_async aber auf die Hauptwarteschlange Dispatching, die der Thread bereits eingeschaltet sind ist. Sie sollten zu einem Hintergrundthread senden, das Bild laden und dann an den Hauptthread senden und die Benutzeroberfläche aktualisieren.

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") 
     } 
    } 

} 
Verwandte Themen