gpt4 book ai didi

iphone - 在我将它们保存到 plist 之前,变量失去了它们的值

转载 作者:行者123 更新时间:2023-11-28 23:01:06 24 4
gpt4 key购买 nike

我正在为我的 plist 编写一个 Controller 类,它被另一个类调用。 controller 类有一个 read 和 save 方法,read 方法打开 plist 并将其保存到文档文件中以供读写。在这个读取类中,我将之前保存的所有值放入它们自己的变量中。

然后在从另一个类调用的 Save 方法调用中,所有值都作为参数传入,然后从那里我将新值传递给正确的变量并将其传递给 plist.. 但是我有一个字典在我的 plist 中,它只保存一个值并将其他值重置为空。我想知道如何确保这些变量保持它们的值?

这是我的.h

#import <Foundation/Foundation.h>

@interface EngineProperties : NSObject {

NSString *signature;
NSNumber *version;
NSNumber *request;
NSNumber *dataVersion;
NSMutableDictionary *cacheValue;
//cachevalue Items
NSNumber *man;
NSNumber *mod;
NSNumber *sub;

}

@property (copy, nonatomic) NSString *signature;
@property (copy, nonatomic) NSNumber *version;
@property (copy, nonatomic) NSNumber *request;
@property (copy, nonatomic) NSNumber *dataVersion;
@property (copy, nonatomic) NSMutableDictionary *cacheValue;
//cachevalue Items
@property (copy, nonatomic) NSNumber *man;
@property (copy, nonatomic) NSNumber *mod;
@property (copy, nonatomic) NSNumber *sub;



- (void) readPlistData;
- (void) saveData:(NSString *)methodName signature:(NSString *)pSignature Version:(NSNumber *)pVersion request:(NSNumber *)rNumber dataVersion:(NSNumber *)dvReturned cacheValue:(NSNumber *)cValue;

@end

这是我的.m

#import "EngineProperties.h"

@implementation EngineProperties

@synthesize signature;
@synthesize version;
@synthesize request;
@synthesize dataVersion;
@synthesize cacheValue;

@synthesize man;
@synthesize mod;
@synthesize sub;



//This opens up and reads the current plist ready to be used
-(void) readPlistData
{
// Data.plist code
// get paths from root direcory
NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
// get documents path
NSString *documentsPath = [paths objectAtIndex:0];
// get the path to our Data/plist file
NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"EngineProperties.plist"];

// check to see if Data.plist exists in documents
if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath])
{
// if not in documents, get property list from main bundle
plistPath = [[NSBundle mainBundle] pathForResource:@"EngineProperties" ofType:@"plist"];
}

// read property list into memory as an NSData object
NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
NSString *errorDesc = nil;
NSPropertyListFormat format;
// convert static property liost into dictionary object
NSDictionary *tempRoot = (NSMutableDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc];
if (!tempRoot)
{
NSLog(@"Error reading plist: %@, format: %d", errorDesc, format);
}
// assign values
self.signature = [tempRoot objectForKey:@"Signature"];
self.version = [tempRoot objectForKey:@"Version"];
self.request = [tempRoot objectForKey:@"Request"];
self.dataVersion = [tempRoot objectForKey:@"Data Version"];

man = [cacheValue objectForKey:@"Man"];
mod = [cacheValue objectForKey:@"Mod"];
sub = [cacheValue objectForKey:@"SubMod"];

cacheValue = [tempRoot objectForKey:@"Cache Value"];
}


- (void) saveData:(NSString *)methodName signature:(NSString *)pSignature Version:(NSNumber *)pVersion request:(NSNumber *)rNumber dataVersion:(NSNumber *)dvReturned cacheValue:(NSNumber *)cValue;
{
// get paths from root direcory
NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
// get documents path
NSString *documentsPath = [paths objectAtIndex:0];
// get the path to our Data/plist file
NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"EngineProperties.plist"];

// set the variables to the values in the text fields
self.signature = pSignature;
self.version = pVersion;
self.request = rNumber;
self.dataVersion = dvReturned;

//do some if statment stuff here to put the cache in the right place or what have you.
if (methodName == @"manufacturers")
{
self.man = cValue;
}
else if (methodName == @"models")
{
self.mod = cValue;
}
else if (methodName == @"subMod")
{
self.sub = cValue;
}

self.cacheValue = [NSDictionary dictionaryWithObjectsAndKeys:
man, @"Manufacturers",
mod, @"Models",
sub, @"SubModels", nil];


NSDictionary *plistDict = [NSDictionary dictionaryWithObjectsAndKeys:
signature, @"Signature",
version, @"Version",
request, @"Request",
dataVersion, @"Data Version",
cacheValue, @"Cache Value", nil];



NSString *error = nil;
// create NSData from dictionary
NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];

// check is plistData exists
if(plistData)
{
// write plistData to our Data.plist file
[plistData writeToFile:plistPath atomically:YES];

NSString *myString = [[NSString alloc] initWithData:plistData encoding:NSUTF8StringEncoding];
// NSLog(@"%@", myString);
}
else
{
NSLog(@"Error in saveData: %@", error);
// [error release];
}
}


@end

我试图找出如何在这三个变量 man、mod、sub 中保持正确的值,以便我可以将它们放入我的缓存值字典中。

最佳答案

问题是当您准备好数据以创建字典时,这里:

if (methodName == @"manufacturers")
{
self.man = cValue;
}
else if (methodName == @"models")
{
self.mod = cValue;
}
else if (methodName == @"subMod")
{
self.sub = cValue;
}

这不是比较字符串的正确方法(你实际上是在比较字符串的地址,所以它们可能永远不会相同),你应该使用这个:

if ([methodName isEqualToString:@"manufacturers"])
{
self.man = cValue;
}
else if ([methodName isEqualToString:@"models"])
{
self.mod = cValue;
}
else if ([methodName isEqualToString:@"subMod"])
{
self.sub = cValue;
}

另一个问题是,在 readPlistData 中,您正在读取键“Man”、“Mod”和“SubMod”,但它们应该与您写入字典的内容相同:“Manufacturers”、“Models”和“子模型”。 (任何一个都可能是正确的,但它们需要匹配,以便您读取和写入相同的 key !)

最后,您是在每次调用 saveData 时都使用相同的 EngineProperties 实例,还是每次都创建一个新对象?如果您使用的不是同一个对象,则每次调用它时 iVars 都会重置为 nil。

关于iphone - 在我将它们保存到 plist 之前,变量失去了它们的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10022388/

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