何时将NSMutablearray写入文件完成?

时间:2011-02-11 17:32:53

标签: iphone nsmutablearray save

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

1 个答案:

答案 0 :(得分:2)

除非您的数据集很大,否则我发现将所有数据保存在内存中更好,并且只在应用程序终止/后台写入磁盘并在应用程序启动时从磁盘读取。创建一个单独的“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