我正在玩一个应该存储笔记的小应用程序。 UI使用主/详细视图模板。
我的MasterView
拥有NoteController
的实例,而后者则保存存储在数组中的所有注释。现在我想使用NSKeyArchiver
保存此数组。我知道在applicationDidEnterBackGround
中实施了AppDelegate.m
方法。
但我无法从NoteController
调用AppDelegate
的实例方法。创建新实例既不会起作用,因为所有数据都将丢失。那么我的设计出了什么问题?
我希望我的问题很清楚。非常感谢您的帮助。
Note.m:
@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
答案 0 :(得分:0)
您可以在NoteController类中实现Singleton Pattern,因此您始终在内存中保留该类的一个实例,并且您也可以从任何类访问该类,包括AppDelegate。
答案 1 :(得分:0)
post a NSNotification使用applicationDidEnterBackground:
中的[NSNotifcationCenter defaultCenter]
。
你必须注意你的task can be finished:
您执行此方法大约需要五秒钟才能执行任何任务并返回。如果您需要额外的时间来执行任何最终任务,可以通过调用beginBackgroundTaskWithExpirationHandler:从系统请求额外的执行时间。实际上,您应该尽快从applicationDidEnterBackground返回:如果方法在时间用完之前没有返回,则应用程序将终止并从内存中清除。
在此方法退出之前,您应该执行与调整用户界面相关的任何任务,但是应根据需要将其他任务(例如保存状态)移动到并发调度队列或辅助线程。因为您可能在applicationDidEnterBackground中启动任何后台任务:在该方法退出之前不会运行,您应该在启动这些任务之前请求额外的后台执行时间。换句话说,首先调用beginBackgroundTaskWithExpirationHandler:然后在调度队列或辅助线程上运行任务。
如果收到通知,请让您的控制器listen (register) to this notification执行保存。
答案 2 :(得分:0)
我的建议是尽快保存Note
。因此,如果-addNote:
Note
已完全实现(包含标题,内容等),那么请在添加时保留它。同样,当您-removeNote:
时,您还会保存“备注文件”。
这简化了问题,将Notes
的所有管理封装到您的NoteController
,并避免不得不以某种方式插入AppDelegate
。
但是,如果此方法不适合您,如果您需要在应用进入后台时保存,则可以让NoteController
观察UIApplicationDidEnterBackgroundNotification
和{{1}为那个结尾保存的处理程序。请注意,在进入后台时保存可能并不理想:如果您的应用在此之前退出(例如崩溃)该怎么办?此外,切换到后台不是一个从事冗长任务的时间,因此您的NoteController
保存可能不适合这个时间。