当写一个NSMutable数组到文件完成?

问题描述:

我正在开发我的第一个iPhone应用程序。我的用户界面由4个选项卡组成。第一个选项卡显示活动项目。最后一个选项卡是一个“设置”选项卡,用户可以在其中打开/关闭项目。设置选项卡包含项目的NSMutableArray(从webservices调用中检索),然后将它们写入应用程序的Documents文件夹中的文件。第一个选项卡通过将文件恢复到NSMutableArray并仅显示IsActive位设置为true的项目来读取文件中的项目。一切正常,除非我在设置选项卡中移动项目状态,然后立即单击第一个选项卡。第一个选项卡未反映在设置选项卡中所做的更改。但是,如果在转到第一个标签之前点击其中一个标签,则第一个标签会正确反映在设置标签中所做的更改。我能想到的唯一的事情是,当从设置选项卡直接进入第一个选项卡时,文件没有完成写入“文档”文件夹。我在设置选项卡的ViewDidDisapper事件中编写NSMutableArray。我错过了什么?谢谢你的帮助。当写一个NSMutable数组到文件完成?

+0

标签? viewDidLoad不会是正确的地方。 – Felix 2011-02-11 17:43:17

除非您的数据集很大,否则我认为将所有数据保存在内存中并且仅在应用程序启动时从应用程序中的磁盘写入终止/背景并从磁盘读取会好得多。创建一个单独的“FooManager”类来保存应用程序不同部分所需的数据,并通过单例类的API访问数据。我认为这比悬挂ProjectAppDelegate的所有东西都要干净得多。这也应该解决你的写/读竞争条件。

编辑:这里是我在当前项目中使用的一个小型单点网络图像缓存管理器类。有时候一个例子值得千言万语:)。为了使用这个类,在任何代码,只需#IMPORT头,并做到:

NetworkImageCacheManager *nicm = [NetworkImageCacheManager sharedInstance]; 
UIImage *img = [nicm imageWithURL:imageURL]; 

下面是这个类的代码:你在哪里加载存储阵列中的第一

#import <Foundation/Foundation.h> 


@interface NetworkImageCacheManager : NSObject 
{ 
    NSMutableDictionary *imgCache; 
} 

@property (nonatomic, retain) NSMutableDictionary *imgCache; 

+ (NetworkImageCacheManager *) sharedInstance; 
- (UIImage *) imageWithURLString:(NSString *)imgURLString; 
- (void) setImage:(UIImage *)theImage forURLString:(NSString *)imgURLString; 

@end 


@implementation NetworkImageCacheManager 
@synthesize imgCache; 

- (id) init 
{ 
    self = [super init]; 
    if (self) 
    { 
     self.imgCache = [NSMutableDictionary dictionary]; 
    } 

    return self; 
} 


+ (NetworkImageCacheManager *) sharedInstance 
{ 
    static NetworkImageCacheManager *g_instance = nil; 

    if (g_instance == nil) 
    { 
     g_instance = [[self alloc] init]; 
    } 

    return g_instance; 
} 


- (UIImage *) imageWithURLString:(NSString *)imgURLString 
{ 
    UIImage *rv = [self.imgCache objectForKey:imgURLString]; 
    return rv; 
} 

- (void) setImage:(UIImage *)theImage forURLString:(NSString *)imgURLString 
{ 
    [self.imgCache setObject:theImage forKey:imgURLString]; 
} 

- (void) dealloc 
{ 
    [imgCache release]; 
    [super dealloc]; 
} 




@end 
+0

我同意。在这种情况下,我没有看到写入磁盘的好处。它使事情复杂化并导致像你所描述的问题。 – raidfive 2011-02-11 18:17:44