【问题标题】:Programmatically unloading all views on iOS Device以编程方式卸载 iOS 设备上的所有视图
【发布时间】:2012-08-27 12:58:12
【问题描述】:

编辑标题

我正在使用 Core Data 来存储从我的服务器收集的一些数据。在appDelegateapplicationDidBecomeActive 中,我检查应用程序是否需要下载新数据(从我服务器上的版本变量)。如果它有旧信息,它会下载新数据。

问题是,在我的某些观点中,我有tableViews。这些数据是从Core Data 中的viewDidLoad 中提取的一组数据中获取的。 打开应用程序时,viewDidLoad 已经被调用,然后它更新了Core Data 中的数据,当我用tableView 输入视图时,所有行都是错误的。就我而言,所有行都显示与第一行相同的图像,并且没有任何文本。我在想旧数组有一些损坏的数据需要重新加载。在我写这篇文章时,我意识到需要再次调用viewDidLoad。或者至少是viewDidLoad 中的代码。我不想将其移至viewDidAppearwillAppear,因为这意味着每次都会发生这种情况。 我考虑过强制重启进程,但我读到这是不可能的,Apple 无论如何都会拒绝强制退出。

实际上,我只需要知道如何以编程方式从AppDelegate 卸载所有视图,这样他们就必须再次调用viewDidLoad。或者再次强制viewDidLoad

【问题讨论】:

  • 您应该为表格视图使用NSFetchedResultsController。 FRC 自动跟踪对托管对象上下文的更改。
  • @MartinR - 是的,我可能应该......但从一开始我就编写了代码来从 NSArray 中获取数据,并在 viewDidLoad 中使用 fetchRequest。我有五个 tableviews 这样做,直到我意识到我应该使用 Core Data。这是我的应用程序的最后一个错误(当前),唯一缺少的是“卸载所有视图”-命令,或“下次强制 viewDidLoad”-命令。
  • 您可以将代码从 viewDidLoad 移动到单独的方法 updateData 方法中。在 viewWillAppear 然后您可以检查 if (needUpdate) [self updateData]; 。 - 篡改视图控制器的视图听起来不是一个好主意。
  • 听起来是个好主意。谢谢。将尝试弄清楚如何设置/检查需要更新。
  • ... 或注册NSManagedObjectContextObjectsDidChangeNotification 并仅在发布该通知时重新加载数据。

标签: objective-c cocoa-touch viewdidload viewdidunload appdelegate


【解决方案1】:

如果您不能使用获取的结果控制器,您可以 注册NSManagedObjectContextObjectsDidChangeNotification:

[[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(contextChanged:)
    name:NSManagedObjectContextObjectsDidChangeNotification
    object:theManagedObjectContext];

仅在必要时重新加载数据:

- (void)contextChanged:(NSNotification *)note
{
    // reload your table data
}

不要忘记移除观察者,例如在dealloc:

[[NSNotificationCenter defaultCenter] removeObserver:self]

【讨论】:

  • “移除观察者”是什么意思?使用 ARC 我不使用 dealloc。我还需要在其他地方删除它吗?
  • 每个addObserver 都需要一个匹配的removeObserver。即使使用 ARC,您也可以为此目的使用 dealloc 方法。
  • 我从未使用过 dealloc,因为我在 ARC 出现后开始使用 iOS。如果我把那行代码放在卸载方法viewDidUnload中会得到同样的结果吗?
  • 根据stackoverflow.com/questions/1768076/…,您不能确定viewDidUnloaddealloc 之前被调用。
  • 我的错,是removeObserver。我已经更新了答案。
猜你喜欢
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多