在iOS通知

时间:2015-09-25 08:57:28

标签: ios swift asynchronous uiview swift2

我有一个UIView,一旦按下按钮就会从服务器更新。

UIView更新发生在dispatch_async()中。通过调试,我可以看到已收到服务器响应,并创建了新的子视图并将其应用于UIView。

然而,视图保持不变 UNTIL 发生另一个iOS通知(例如,设备收到电子邮件)。一旦显示通知横幅,UIView就会刷新并显示服务器中的图像。

我错过了什么?如何在添加新子视图后立即更新UIView?

注意:我在dispatch_async()内外尝试了以下内容,并尝试在初始更改发生后在同一队列中调用它们,但没有运气。

  • self.view.setNeedsDisplay()
  • self.view.bringSubviewToFront(视图)
  • self.view.layoutIfNeeded()(感谢@buxik的建议)

编辑添加了代码(较大类的小版本,仅添加了相关部分):

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

1 个答案:

答案 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条件是确保不会持续触发通知。我不知道为什么两次调用这个函数有效,但确实如此。