我正在尝试找到一种正确的方法来通知视图控制器它应该根据另一个视图控制器的操作从服务器获取数据。
例如 - 一个视图控制器显示一个推文列表,一个视图控制器让用户创建一条推文。在用户创建推文后,负责创建推文的视图控制器正在被解雇,负责呈现推文的视图控制器现在应该知道它应该从服务器重新加载它的数据,以便向用户显示他刚创建的推文。
起初,我认为NSNotificationCenter
是可行的方法,但经过一些研究(主要是this twitter discussion)后,我发现建议删除{{1}中的通知观察者视图控制器的方法,在上面描述的场景中,使通知无用,因为呈现视图控制器在收到通知的时候已经从通知的观察者中删除了自己(因为它被“创建推文”视图控制器隐藏,从而导致调用它的viewDidDisappear
方法。
委托在这里也是一个问题,因为可能还有其他视图控制器也可能需要知道何时创建新的推文,以便更新他们的视图/从服务器等获取数据< / p>
由于所描述的流程非常受欢迎,我认为必须有一种正确的方式让这两个视图控制器以一种有意义的方式进行通信。
有什么想法吗?
答案 0 :(得分:1)
您可以在数据/网络模型中设置标记。
假设您有一个TweetNetworking.swift
文件,其中包含您的服务器请求,您可以添加var needFeedRefresh: BOOL
。
然后,只需要在需要时将其设置为true
,并在刷新Feed后false
。
然后,您可以在viewWillAppear
。
另一种方法是,如果需要定期刷新,请将此变量键入NSDate
,并在需要强制刷新时将其设置为NSDate(timeIntervalSince1970:0)
。
答案 1 :(得分:1)
如果使用NSNotificationCenter
的唯一障碍是事实,那个观察者已在viewDidDisapper
中移除,您可以将removeObserver
移至deinit
,假设您的观察者是只隐藏而不是解除分配。
有关详细信息,请参阅:iOS8: Where To Remove Observer for NSNotification in Swift(它是由您提及的推文讨论作者撰写的帖子。)
答案 2 :(得分:0)
当您显示另一个视图控制器以撰写推文时,您还可以在呈现视图控制器时添加通知侦听器。然后在回调中删除该侦听器;那么听众将被移除。
func showTweetComposer() {
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(UIPresentingViewController.tweetComposed(_:)), name: UITweetComposeViewControllerDoneKey, object: nil)
}
func tweetComposed(notification: NSNotification) {
NSNotificationCenter.defaultCenter().removeObserver(self, name:notification.name, object: nil)
}