0

我正在玩一个应该存储笔记的小应用程序。UI 使用主/详细视图模板。

MyMasterView持有一个实例,NoteController该实例又包含存储在数组中的所有笔记。现在我想使用NSKeyArchiver. 我知道有applicationDidEnterBackGround实现的方法AppDelegate.m

但是我不能调用NoteControllerfrom的实例方法AppDelegate。创建一个新实例也不起作用,因为所有数据都会丢失。那么我的设计有什么问题呢?

我希望很清楚我的问题是什么。非常感谢您的帮助。

注意.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
4

3 回答 3

0

使用[NSNotifcationCenter defaultCenter]from发布 NSNotificationapplicationDidEnterBackground:

在那里你必须注意你的任务可以完成

您对此方法的实现大约有五秒钟的时间来执行任何任务并返回。如果您需要额外的时间来执行任何最终任务,您可以通过调用 beginBackgroundTaskWithExpirationHandler: 从系统请求额外的执行时间。在实践中,您应该尽快从 applicationDidEnterBackground: 返回。如果该方法在时间用完之前没有返回,则您的应用程序将被终止并从内存中清除。

您应该在此方法退出之前执行与调整用户界面相关的任何任务,但其他任务(例如保存状态)应根据需要移动到并发调度队列或辅助线程。因为您在 applicationDidEnterBackground: 中启动的任何后台任务很可能在该方法退出之前不会运行,因此您应该在启动这些任务之前请求额外的后台执行时间。换句话说,首先调用 beginBackgroundTaskWithExpirationHandler: 然后在调度队列或辅助线程上运行任务。

如果收到通知,让您的控制器侦听(注册)此通知并执行保存。

于 2013-05-21T12:52:53.563 回答
0

您可以在 NoteController 类中实现单例模式,因此您始终在内存中保留该类的一个实例,并且您将能够从任何类(包括 AppDelegate)访问它。

于 2013-05-21T12:41:15.643 回答
0

我的建议是尽快保存Note。因此,如果当您完全意识到-addNote:Note一点(有标题、内容等)时,请在添加时保存它。同样,当你-removeNote:,你也会保存你的“笔记文件”。

这简化了事情,将所有管理封装Notes到您NoteControllerAppDelegate.

但是,如果这种方法对您不起作用,如果您确实需要在应用程序进入后台时保存,您可以让您的NoteController观察UIApplicationDidEnterBackgroundNotificationNoteController为此保存一个处理程序。请注意,在进入后台时保存可能并不理想:如果您的应用在此之前退出(例如崩溃)怎么办?此外,切换到后台不是从事冗长任务的时间,因此您的Note保存可能不适合此时。

于 2013-05-21T12:53:26.130 回答