2011-02-11 90 views
0

我正在開發我的第一個iPhone應用程序。我的用戶界面由4個選項卡組成。第一個選項卡顯示活動項目。最後一個選項卡是一個「設置」選項卡,用戶可以在其中打開/關閉項目。設置選項卡包含項目的NSMutableArray(從webservices調用中檢索),然後將它們寫入應用程序的Documents文件夾中的文件。第一個選項卡通過將文件恢復到NSMutableArray並僅顯示IsActive位設置爲true的項目來讀取文件中的項目。一切正常,除非我在設置選項卡中移動項目狀態,然後立即單擊第一個選項卡。第一個選項卡未反映在設置選項卡中所做的更改。但是,如果在轉到第一個標籤之前點擊其中一個標籤,則第一個標籤會正確反映在設置標籤中所做的更改。我能想到的唯一的事情是,當從設置選項卡直接進入第一個選項卡時,文件沒有完成寫入「文檔」文件夾。我在設置選項卡的ViewDidDisapper事件中編寫NSMutableArray。我錯過了什麼?謝謝你的幫助。當寫一個NSMutable數組到文件完成?

+0

標籤? viewDidLoad不會是正確的地方。 – Felix 2011-02-11 17:43:17

回答

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 
+0

我同意。在這種情況下,我沒有看到寫入磁盤的好處。它使事情複雜化並導致像你所描述的問題。 – raidfive 2011-02-11 18:17:44

相關問題