如何在不重新加载页面的情况下刷新Swift中的imageview?

时间:2016-01-15 00:52:01

标签: ios swift

我有一个更新照片按钮,连接到facebookgraphAPI并下载当前用户的个人资料照片。 我希望我的视图上的图像能够刷新,而无需重新加载viewController。 有办法做到这一点吗?我知道tableviewreloadDatarefreshcontrol,但我没有使用tableview

class ProfileViewController: UIViewController , UITextViewDelegate{

@IBOutlet weak var imageView: UIImageView!

@IBOutlet weak var nameLabel: UILabel!

@IBOutlet weak var profileTextView: UITextView!


@IBAction func updatePicture(sender: UIButton) {
    // pulls in latest facebook profile info
    let vc = ViewController()
    vc.getFBUserInfo(PFUser.currentUser()!)

    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        self.imageView.setNeedsDisplay()
        self.loadPhoto()
    })
}

override func viewDidLoad() {
    super.viewDidLoad()

    loadProfile()
    loadPhoto()
}

func loadPhoto() {
    currentUser()?.getPhoto({
        image in
        self.imageView.layer.masksToBounds = true
        self.imageView.contentMode = .Center
        self.imageView.image = image
    })
}

func loadProfile () {
    nameLabel.text = currentUser()?.name

    // get the existing profile from DB
    if let profile = PFUser.currentUser()!.objectForKey("profileText") as? String {
        profileTextView.text = profile
    }

    profileTextView.delegate = self
}

User.swift getPhoto功能:

func getPhoto(callback:(UIImage) -> ()) {
    let imageFile = pfUser.objectForKey("picture") as! PFFile
    imageFile.getDataInBackgroundWithBlock({
        data, error in
        if let data = data {
            callback(UIImage(data: data)!)
        }
    })
}

1 个答案:

答案 0 :(得分:3)

您的回调看起来可能正在后台队列中调用。当您在后台访问其类时,UIKit不喜欢它,并且常见的副作用是看起来UI没有更新(或者在延迟之后不会更新)。

尝试

func loadPhoto() {
    currentUser()?.getPhoto({
        image in
            dispatch_async(dispatch_get_main_queue(), {
               self.imageView.layer.masksToBounds = true
               self.imageView.contentMode = .Center
               self.imageView.image = image
            })

    })
}