Objective c 将NSMutableArray的内容写入plist文件

Objective c 将NSMutableArray的内容写入plist文件,objective-c,cocoa-touch,Objective C,Cocoa Touch,因此,在我的应用程序中有一个页面,其中会出现一个较大的文本字段,用户输入文本并点击保存按钮。当点击save按钮时,一个名为savedPosts的NSMutableArray(在AppDelegate文件中声明)将textfield的文本内容保存到此数组中。此保存代码是从其他视图控制器调用的,而不是从AppDelegate调用的,即使实际数组是在AppDelegate中声明的。我不确定这是否是个坏主意,但这仍然不是问题所在。无论如何,我希望这样,每当用户在一篇新的或现有的文章上点击save按钮时,

因此,在我的应用程序中有一个页面,其中会出现一个较大的文本字段,用户输入文本并点击保存按钮。当点击save按钮时,一个名为savedPosts的NSMutableArray(在AppDelegate文件中声明)将textfield的文本内容保存到此数组中。此保存代码是从其他视图控制器调用的,而不是从AppDelegate调用的,即使实际数组是在AppDelegate中声明的。我不确定这是否是个坏主意,但这仍然不是问题所在。无论如何,我希望这样,每当用户在一篇新的或现有的文章上点击save按钮时,它都会将另一个对象添加到数组中,并将同一个对象保存到plist中。设置将帖子从文本字段保存到数组并自动保存到plist的最佳方法是什么。如何使它在每次将对象添加到数组时都将其添加到plist文件中。数组应该在哪里声明和分配?

-[NSArray writeToFile:atomically:]就可以做到这一点,而且将应用程序委托用作与整个应用程序共享数据的中心位置也没有错,这就是它的用途。此外,如果这些数据在您的应用程序的执行之间是小的和持久的,那么您可能需要考虑通过NSuleDebug来将其保存到您的用户默认值。

< P> <代码> -[NSnabraseLeToFiel:Maxix:];<只要数组的内容是由plist对象组成的,code>就可以做到这一点,而且将应用程序委托用作与整个应用程序共享数据的中心位置也没有错,这就是它的用途。此外,如果这些数据在你的应用程序的执行之间是小的和持久的,那么你可能想考虑通过NSuleDebug来将它保存到你的用户默认值。

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

下面附上了这样一个类的一个非常简单的实现,它只做您在问题中描述的事情。然而,应注意的是,该代码仅用于参考值,如果数据集变得非常大,则显然不会进行缩放

这个简单的参考实现将需要用于GCD调用的iOS 4.0+,并且需要使用用于实现中的IVAR的LLVM 2.0+编译器构建。如果您想支持早期版本的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
//Posts.h
#进口
@接口帖子:NSObject
@属性(非原子,只读)NSArray*posts;
//在URL处使用数组初始化或创建文件
//如果没有数组;如果为零,则发布内容
//不持久
-(id)initWithURL:(NSURL*)url;
-(无效)附录post:(NSString*)post;
@结束
//波斯特
#导入“Posts.h”
@执行员额{
//持久内容URL
NSURL*url;
//内存阵列
NSMUTABLEARRY*_职位;
//用于同步
调度队列;
}
@动态员额;
-(id)init
{
返回[self initWithURL:nil];
}
-(id)initWithURL:(NSURL*)url
{
if((self=[super init])){
如果(url){
_url=[url副本];
_posts=[[NSMutableArray alloc]initWithContentsOfURL:_url];
如果(!\u帖子){
//您可能不想这样做,因为它可能会在以后销毁位于url的任何内容
NSLog(@“警告:无法分析url“@”的内容:正在创建新文件“,\u url);
}
}否则{
_posts=[[NSMutableArray alloc]init];
}
_postQueue=dispatch\u queue\u create(“org.example.post\u queue”,0);
}
回归自我;
}
-(无效)解除锁定
{
[_url发布];
[_发布帖子];
调度发布(发布队列);
[super dealoc];
}
-(NSArray*)员额
{
__块NSArray*柱=零;
如果(分派\u获取\u当前\u队列()!=\u后队列){
调度同步(_postQueue,^{posts=[_postscopy];});
}否则{
posts=[[u posts copy];
}
返回[发布自动释放];
}
-(void)appendPost:(NSString*)post
{
if([post length]==0)返回;
调度异步(\u postQueue^{
[_postsappendobject:post];
if(_url)[_postswritetourl:_url原子化:YES];
});
}
@结束

如果您想确保在添加新帖子时始终写出帖子,我将创建一个非常简单的类来处理整个帖子。您可以使用某个URL初始化该类,然后将旧的持久化数据读入数组,并实现某种
-appendPost:
类型的方法,该方法处理添加新帖子并将数据持久化回URL。然后,应用程序委托可以简单地管理指向适当URL的此类实例。你可以根据需要使它变得复杂或简单

下面附上了这样一个类的一个非常简单的实现,它只做您在问题中描述的事情。然而,应注意的是,该代码仅用于参考值,如果数据集变得非常大,则显然不会进行缩放

这个简单的参考实现将需要用于GCD调用的iOS 4.0+,并且需要使用用于实现中的IVAR的LLVM 2.0+编译器构建。如果您想支持iO的早期版本