何时将 NSMutablearray 写入文件完成?

Posted

技术标签:

【中文标题】何时将 NSMutablearray 写入文件完成?【英文标题】:when is writing a NSMutable array to a file complete? 【发布时间】:2011-02-11 17:32:53 【问题描述】:

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

【问题讨论】:

第一个选项卡中存储的数组在哪里加载? viewDidLoad 不是正确的地方。 【参考方案1】:

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

编辑:这是我在当前项目中使用的一个很小的单例网络图像缓存管理器类。有时一个例子值一千字的教程:)。为了使用这个类,在任何代码中,只需#import header,然后:

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

【讨论】:

我同意。在这种情况下,我认为写入磁盘没有多大好处。它只会使事情复杂化并导致像您所描述的那样的问题。 我会研究这种方法。你能推荐一些教程吗?感谢您的宝贵时间。

以上是关于何时将 NSMutablearray 写入文件完成?的主要内容,如果未能解决你的问题,请参考以下文章

同时向 NSMutableArray 写入和读取数据

如何知道 npm `unzip` 模块何时完成解压缩文件?

CoreData 何时真正写入 sqlite 文件?

writeToFile 如何判断何时完成

增量写入 plist 文件

将 NSMutableArray 保存到 iPhone 文档目录