Swift asynch从目录加载图像

时间:2016-09-10 09:59:05

标签: ios swift swift2

我遇到的情况是我填写表单并从库中设置图像然后存储在目录中。 我可以从目录中获取图像,但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
    }

}

1 个答案:

答案 0 :(得分: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")
        }
    }

}