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