需要帮助我的微小Objective-c类设计。如何访问我的实例var?

时间:2013-05-21 12:30:54

标签: ios objective-c cocoa-touch

我正在玩一个应该存储笔记的小应用程序。 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

3 个答案:

答案 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保存可能不适合这个时间。