我正在玩一个应该存储笔记的小应用程序。UI 使用大纲/细节视图模板。
我的MasterView
保存了一个NoteController
实例,该实例又保存存储在数组中的所有笔记。现在我想使用 NSKeyArchiver
保存这个数组。我知道有applicationDidEnterBackGround
在AppDelegate.m
中实现的方法。
但是我无法从AppDelegate
调用NoteController
的实例方法。创建新实例也不起作用,因为这样所有数据都会丢失。那么我的设计有什么问题呢?
我希望清楚我的问题是什么。非常感谢您的帮助。
注:
@interface Note : NSObject
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *content;
@property (nonatomic, strong) NSDate *creationDate;
@end
NoteController.m:
@class Note;
@interface NoteDataController : NSObject
@property (nonatomic, retain) NSMutableArray *masterNoteList;
@property (nonatomic, copy) NSString *dataFilePath;
- (NSUInteger) countOfList;
- (Note*) objectInListAtIndex:(NSUInteger)theIndex;
- (void) addNote:(Note*)theNote;
- (void) removeNote:(NSUInteger)theIndex;
- (void) loadMasterList;
- (void) saveMasterList;
@end
我的建议是尽快保存Note
。因此,如果您-addNote:
该Note
已完全实现(具有标题,内容等(,则在添加时保留它。同样,当您-removeNote:
,您还将保存您的"笔记文件"。
这简化了事情,将所有Notes
管理封装到您的NoteController
,并避免了不得不做一些事情,例如以某种方式进入AppDelegate
。
但是,如果此方法对您不起作用,如果您确实需要在应用程序进入后台时保存,则可以让您的NoteController
观察UIApplicationDidEnterBackgroundNotification
并且NoteController
有一个用于该端保存的处理程序。请注意,进入后台时保存可能并不理想:如果您的应用程序在此发生之前退出(例如崩溃(怎么办?此外,切换到背景不是从事冗长任务的时候,因此您的Note
保存可能不适合这个时间。
使用 applicationDidEnterBackground:
中的[NSNotifcationCenter defaultCenter]
发布 NSNotization。
在那里,您必须注意您的任务可以完成:
此方法的实现有大约五秒钟的时间来执行任何任务并返回。如果需要额外的时间来执行任何最终任务,可以通过调用beginBackgroundTaskWithExexpationHandler:从系统请求额外的执行时间。在实践中,您应该尽快从applicationDidEnterBackground返回。如果该方法在时间用完之前未返回,则应用程序将终止并从内存中清除。
在此方法退出之前,应执行与调整用户界面相关的任何任务,但其他任务(如保存状态(应根据需要移动到并发调度队列或辅助线程。由于在 applicationDidEnterBackground: 中启动的任何后台任务很可能在该方法退出之前才会运行,因此应在启动这些任务之前请求额外的后台执行时间。换句话说,首先调用beginBackgroundTaskWithExexpationHandler:,然后在调度队列或辅助线程上运行任务。
让您的控制器侦听(注册(此通知并执行保存(如果收到通知(。
您可以在 NoteController 类中实现单例模式,以便始终在内存中保留该类的一个实例,并且还可以从任何类(包括 AppDelegate(访问该实例。