gpt4 book ai didi

iphone - 保存在 NSDocumentDirectory 或 NSCachesDirectory

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:06:18 24 4
gpt4 key购买 nike

曾尝试将我的 NSMutableArray 对象存储到 NSUserDefaults,但没有成功。我的 NSMutableArray 在此处包含此日志:

`ALAsset - Type:Photo, URLs:assets-library://asset/asset.JPG?id=92A7A24F-D54B-496E-B250-542BBE37BE8C&ext=JPG`

我知道它是一个 ALAsset 对象,在 AGImagePickerController 中它被比作 NSDictionary,所以我需要做的是保存 NSDictionary 或我以前使用的数组我在哪里存储我的 ALAsset 对象,然后将其作为文件保存在 NSDocuNSCaches 中,然后再次检索它(这是我的想法)。

但问题是,虽然我试过这段代码但没有工作,并且在 NSDocuNSCache 目录中没有显示任何内容。

第一次尝试(info 是包含ALAsset 对象 的):

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSString *filePath = [basePath stringByAppendingPathComponent:@"filename.plist"];
NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfURL:filePath];
NSString *error;
NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];
if(plistData) {
[info writeToFile:filePath atomically:YES];
} else {
NSLog(error);

}

第二次尝试:

- (NSString *)createEditableCopyOfFileIfNeeded:(NSString *)_filename {
// First, test for existence.
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableFilePath = [documentsDirectory stringByAppendingPathComponent: _filename ];

success = [fileManager fileExistsAtPath:writableFilePath];
if (success) return writableFilePath;

// The writable file does not exist, so copy the default to the appropriate location.
NSString *defaultFilePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: _filename ];
success = [fileManager copyItemAtPath:defaultFilePath toPath:writableFilePath error:&error];
if (!success) {
NSLog([error localizedDescription]);
NSAssert1(0, @"Failed to create writable file with message '%@'.", [error localizedDescription]);
}
return writableFilePath;
}

这样保存:

    NSString *writableFilePath = [self createEditableCopyOfFileIfNeeded:[NSString stringWithString:@"hiscores"]];   
if (![info writeToFile:writableFilePath atomically:YES]){
NSLog(@"WRITE ERROR");
}

第三次尝试:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:??????];

[info writeToFile:filePath atomically:YES];

第四次尝试(不确定,因为它在 appbundle 中进行了修改): https://stackoverflow.com/a/6311129/1302274

还有别的办法吗?希望有人指导我。

最佳答案

您可以通过将 NSMutableArray 归档到 NSData 来将其存储到 NSUserDefault,然后通过将其解档回 NSMutableArray 来检索它。

-(NSData*) getArchievedDataFromArray:(NSMutableArray*)arr
{
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr];
return data;
}

-(NSMutableArray*) getArrayFromArchievedData:(NSData*)data
{
NSMutableArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
return arr;
}

将数组保存到 NSUserDefault :

  [[NSUserDefaults standardUserDefaults] setObject:[self getArchievedDataFromArray: yourArray] forKey:@"YourKey"];
[[NSUserDefaults standardUserDefaults] synchronize];

从 NSUserDefault 中取回数组:

NSMutableArray *yourArray = [self getArrayFromArchievedData:[[NSUserDefaults standardUserDefaults]objectForKey:@"YourKey"]];  

您还可以将数组以 NSData 的形式保存到 NSDocumentDirectory 或 NSCachesDirectory 中的文件中。希望这会有所帮助....

已编辑:一个 UIImage+NSCoding 类别

.h文件

#import <UIKit/UIKit.h>

@interface UIImage (NSCoding)
- (id) initWithCoderForArchiver:(NSCoder *)decoder;
- (void) encodeWithCoderForArchiver:(NSCoder *)encoder ;
@end

.m文件

#import "UIImage+NSCoding.h"
#import <objc/runtime.h>
#define kEncodingKey @"UIImage"

@implementation UIImage (NSCoding)

+ (void) load
{

@autoreleasepool {
if (![UIImage conformsToProtocol:@protocol(NSCoding)]) {
Class class = [UIImage class];
if (!class_addMethod(
class,
@selector(initWithCoder:),
class_getMethodImplementation(class, @selector(initWithCoderForArchiver:)),
protocol_getMethodDescription(@protocol(NSCoding), @selector(initWithCoder:), YES, YES).types
)) {
NSLog(@"Critical Error - [UIImage initWithCoder:] not defined.");
}

if (!class_addMethod(
class,
@selector(encodeWithCoder:),
class_getMethodImplementation(class, @selector(encodeWithCoderForArchiver:)),
protocol_getMethodDescription(@protocol(NSCoding), @selector(encodeWithCoder:), YES, YES).types
)) {
NSLog(@"Critical Error - [UIImage encodeWithCoder:] not defined.");
}

}
}
}

- (id) initWithCoderForArchiver:(NSCoder *)decoder {
if (self = [super init]) {
NSData *data = [decoder decodeObjectForKey:kEncodingKey];
self = [self initWithData:data];
}

return self;

}

- (void) encodeWithCoderForArchiver:(NSCoder *)encoder {

NSData *data = UIImagePNGRepresentation(self);
[encoder encodeObject:data forKey:kEncodingKey];

}

@end

关于iphone - 保存在 NSDocumentDirectory 或 NSCachesDirectory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12950916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com