2011-08-19 120 views
0

因此,我的应用程序中出现一个大文本字段的页面,用户输入文本并点击保存按钮。当保存按钮被击中时,在AppDelegate文件中声明的名为savedPosts的NSMutableArray将文本字段的文本内容保存到此数组中。这个保存代码是从其他视图控制器调用的,而不是AppDelegate,即使实际的数组是在AppDelegate中声明的。我不确定这是不是一个好主意,但这仍然不是问题。无论如何,我需要它,以便每当用户点击新的或现有的帖子上的保存按钮时,它会向数组中添加另一个对象并将同一对象保存到plist。什么是设置这整个事情的最佳方式 - 将文本从文本字段保存到将数据自动保存到plist的数组中。如何在每次将其添加到数组时将其添加到plist文件中。数组应该在哪里被声明和分配?将NSMutableArray的内容写入plist文件

回答

2

如果你想确保你的帖子总是在你添加新帖的时候写出来,我会做一个非常简单的类来处理帖子的整体。您可以使用一些URL初始化该类,然后将旧的持久数据读入数组,并实现一些处理添加新帖子并将数据保留回URL的方法类型。应用程序委托可以简单地管理这个类的一个实例,指向适当的URL。您可以根据需要使其变得复杂或简单。

下面附上了一个非常简单的这样的类的实现,它只是您在问题中描述的内容。但是,应该注意的是,代码仅供参考,如果数据集变得非常大,显然不会扩展。

这个简单的参考实现需要iOS 4.0+用于GCD调用,并且需要用LLVM 2.0+编译器为ivars-in-implementation构建。如果你想支持iOS的早期版本,你可以删除GCD并同步其他方式或阻止(不推荐)。如果你想用GCC-LLVM而不是Clang构建,你可以将ivar decl移动到界面上。

// Posts.h 
#import <Foundation/Foundation.h> 

@interface Posts : NSObject 

@property(nonatomic, readonly) NSArray* posts; 

// Initialize with array at URL or create file 
// if no array is there; if nil, posts contents 
// are not persisted 
- (id)initWithURL:(NSURL*)url; 
- (void)appendPost:(NSString*)post; 

@end 

// Posts.m 
#import "Posts.h" 

@implementation Posts { 
    // Persistent content URL 
    NSURL* _url; 

    // In-memory array 
    NSMutableArray* _posts; 

    // Used for synchronizing 
    dispatch_queue_t _postQueue; 
} 

@dynamic posts; 

- (id)init 
{ 
    return [self initWithURL:nil]; 
} 

- (id)initWithURL:(NSURL*)url 
{ 
    if((self = [super init])) { 
     if(url) { 
      _url = [url copy]; 
      _posts = [[NSMutableArray alloc] initWithContentsOfURL:_url]; 
      if(!_posts) { 
       // You may not want to do this as it may later destroy whatever may have been at _url 
       NSLog(@"Warning: Could not parse contents of url '%@': Creating new file", _url); 
      } 
     } else { 
      _posts = [[NSMutableArray alloc] init]; 
     } 
     _postQueue = dispatch_queue_create("org.example.post_queue", 0); 
    } 
    return self; 
} 

- (void)dealloc 
{ 
    [_url release]; 
    [_posts release]; 
    dispatch_release(_postQueue); 
    [super dealloc]; 
} 

- (NSArray*)posts 
{ 
    __block NSArray* posts = nil; 
    if(dispatch_get_current_queue() != _postQueue) { 
     dispatch_sync(_postQueue, ^{ posts = [_posts copy]; }); 
    } else { 
     posts = [_posts copy]; 
    } 
    return [posts autorelease]; 
} 

- (void)appendPost:(NSString*)post 
{ 
    if([post length] == 0) return; 

    dispatch_async(_postQueue, ^{ 
     [_posts appendObject:post]; 
     if(_url) [_posts writeToURL:_url atomically:YES]; 
    }); 
} 

@end 
1

-[NSArray writeToFile:atomically:];只要你的数组的内容是由plist对象组成,那么你的应用程序委托作为数据的中心位置与你的整个应用程序共享也没有错,那就是什么它的。另外,如果这些数据在执行应用程序之间很小且持久,则可能需要考虑通过NSUserDefaults将其保存为用户默认值。