从AppDelegate更新ViewController - 最佳实践?

6

我是一个有用的助手,可以为您翻译文本。

我正在尝试使用iBeacons在AppDelegate.swift内实现CoreLocation方法(这些方法在AppDelegate中实现,以确保应用程序具有后台功能)。

在带有“ViewController.swift”的SingleView应用程序中,从AppDelegate传递数据到ViewController以更新视图,例如UIImages、UILabels或UITableViews,哪种最佳实践?

我已经成功地实现了两种不同的方法:

1)委托,在AppDelegate.swift内触发Viewcontroller委托方法:

protocol BeaconLocationDelegate { func minorBeaconChanged(minorValue:NSNumber) }

var locationDelegate: BeaconLocationDelegate

locationDelegate?.minorBeaconChanged(nearestBeacon.minor)

ViewController.swift:

在viewDidLoad方法中:

(UIApplication.sharedApplication().delegate as AppDelegate).locationDelegate = self

我觉得这种写法有些难看 - 是否有更好的方式来声明属性为代理?
协议实现:
func minorBeaconChanged(minorValue: NSNumber) {
  // do fancy stuff here
}

2)通过在AppDelegate内创建对ViewController的引用:

let viewController:ViewController = window!.rootViewController as ViewController
viewController.doSomethingFancy()

这两种方法对我来说都可以,但是我认为通过委托的第一种方法更加优雅,在你有多个视图控制器时也是更好的选择。

有什么建议吗?

2个回答

1
这个怎么样?
在AppDelegate中。
var minorBeaconChanged: NSNumber -> () = { minor in }

当位置更新时,请调用此方法。 在ViewController的viewWillAppear中。
( UIApplication.sharedApplication().delegate as? AppDelegate )!.minorBeaconChanged = { minor in
//  Do with minor
}

编辑:2015年8月27日

如果您想要多个观察者。

在AppDelegate中

var minorBeaconObservers: [ NSNumber -> () ] = []

在minorBeaconObservers中调用所有项目,并使用“minor”进行标识。

在ViewController的viewWillAppear中。

( UIApplication.sharedApplication().delegate as? AppDelegate )!.minorBeaconObservers.append( 
    { minor in
    //  Do with minor
    }
)

这样 minorBeaconChanged 只能有一个观察者,但是我现在正在使用它。 - Bruno Lemos

1
我认为第二种解决方案更容易。这也确保了视图控制器不会被释放,应用委托也不会尝试联系不存在的对象。
此外,在存在多个控制器的情况下,我不理解委托参数。在这种情况下,你需要有多个委托,这真的不是一个理想的情况。或者你需要从外部将委托更改为不同的视图控制器 - 这也不是非常优雅且风险很大。
对于多个视图控制器的场景,我建议使用 NSNotificationCenter 发送通知。这是一种松散耦合,只有需要反应的对象才会收到消息。视图控制器应该在创建时开始监听通知,并在它们消失时从通知中心注销。

这也是最佳实践吗?我认为委托会是最好的选择,部分原因是MVC概念中,对视图的更新主要由委托方法触发,从而将视图与模型分离。 - Andy
我对在appdelegate中处理数据也没有太多信心。正在寻找将其移入单独类的方法,但仍不确定如何操作。目标是从肮脏的hack转向良好且可重用的代码。 - Andy
1
提出的解决方案不违反MVC。我们根本没有讨论模型。这只是一个问题,即您希望将控制器与应用程序委托(应用程序的“全局”类)紧密耦合的程度。非常松散(通知)或紧密(保留属性)。在您的用例中,没有理由反对紧密耦合。 - Mundi
你的第二条评论涉及到一个不同的问题,也许你应该在另一个问题中解决它。欢迎来到Stackoverflow。通过点赞和/或接受答案开始表达感激之情。 - Mundi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接