我有一个UIView,一旦按下按钮就会从服务器更新。
UIView更新发生在dispatch_async()中。通过调试,我可以看到已收到服务器响应,并创建了新的子视图并将其应用于UIView。
然而,视图保持不变 UNTIL 发生另一个iOS通知(例如,设备收到电子邮件)。一旦显示通知横幅,UIView就会刷新并显示服务器中的图像。
我错过了什么?如何在添加新子视图后立即更新UIView?
注意:我在dispatch_async()内外尝试了以下内容,并尝试在初始更改发生后在同一队列中调用它们,但没有运气。
编辑添加了代码(较大类的小版本,仅添加了相关部分):
class networkedImage: UIViewController {
@IBOutlet var viewArea: UIView = UIView()
let originalWidth: CGFloat = 200
let originalHeight: CGFloat = 100
let imageURL: NSURL = NSURL(string: "www.example.com/image.jpg")!
func updateViewArea() {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
dispatch_async(dispatch_get_main_queue()) {
self.viewArea.subviews.forEach({ $0.removeFromSuperview() })
let newImageView = UIImageView(frame: CGRectMake(0, 0, self.originalWidth, self.originalHeight))
let data = NSData(contentsOfURL: self.imageURL)
if data != nil {
let image = UIImage(data: data!)
if image != nil {
newImageView.image = image
self.viewArea.addSubview(newImageView)
self.viewArea.bringSubviewToFront(newImageView)
self.viewArea.setNeedsDisplay()
}
NSNotificationCenter.defaultCenter().addObserverForName("NotificationIdentifier", object: nil, queue: nil, usingBlock: {
[unowned self] note in
print("I thought this might work, it didn't.")
})
}
}
}
}
}
答案 0 :(得分:0)
要解决此问题,我向viewDidLoad()
添加了一个Observer NSNotificationCenter.defaultCenter().addObserverForName("imageReadyNotification", object: nil, queue: NSOperationQueue.mainQueue(), usingBlock: {
[unowned self] note in
self.updateViewArea()
})
然后在updateViewArea()的底部发布通知
if self.newImage == true {
NSNotificationCenter.defaultCenter().postNotificationName("imageReadyNotification", object: nil, userInfo: nil)
}
if条件是确保不会持续触发通知。我不知道为什么两次调用这个函数有效,但确实如此。