在 MvvmCross 解决方案中,我有一个单例服务类,它从 Web 服务获取项目并更新公共 ObservableCollection。它每五秒钟执行一次,并且可以添加或删除项目或更改它们的属性。
我还有一个 ViewModel,它有一个设置为服务的 ObservableCollection 的公共属性。View 绑定到 ObservableCollection,因此当添加、删除或更改项目时,视图应该更新以显示这一点。
但是,正如预期的那样,我遇到了线程异常,因为 ObservableCollection 正在由 Main/UI 以外的线程更新,因此绑定无法更新 UI。
在服务中,我没有InvokeOnMainThread
随时可用的调用,因此在更新 ObservableCollection 时没有明显的跨平台方法可以返回到主线程。此外,这样做似乎是错误的——服务不应该关注 UI 问题(而 ViewModel 可以)。
此外,如果这会导致 ViewModel 不被垃圾收集,我对从服务中公开事件感到有点紧张。我注意到在@slodge 的 N+1 系列http://mvvmcross.wordpress.com/中,他使用消息服务大概是为了避免这种情况。
因此,一个可能的解决方案可能是发布一条带有最新项目列表的消息,并让 ViewModel 订阅该消息并通过比较消息内容来更新它自己的 UI 线程上的 ObservableCollection。但这似乎有点笨拙。
任何有关实施此方法的最佳方法的建议将不胜感激 - 谢谢。