gpt4 book ai didi

ios - 使用自定义对象保存 NSMutableArray 时出现问题

转载 作者:行者123 更新时间:2023-11-28 21:44:52 24 4
gpt4 key购买 nike

我有一个名为 CurrentUser 的类,它包含一个名为 listOfFriendsNSMutableArray。此 listOfFriends 包含 Friends 类的对象。

CurrentUserFriend 类都处理了NSCoding 协议(protocol)。Friend 对象有一个名为 userImg 的属性,它是一个 UIImage。只有一个问题。当我尝试加载 lisOfFriends 时, friend 们没有随附他们的 UIImages

如果我保存任何 friend ,并尝试再次加载它,它会随 UIImage 一起出现,没有问题。但是如果对象在 listOfFriends 中,它不会随 UIImage 一起提供,但所有其他信息都会正确加载。

我的问题是:如何存储和加载带有自定义对象的 NSMutableArray?friendList声明:

CurrentUser.h

@property (nonatomic,strong)NSMutableArray *FriendsList;

当前用户.m

  - (void) encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:username forKey:@"username"];
[encoder encodeObject:FriendsList forKey:@"FriendsList"];
//testing direct friend saving
[encoder encodeObject:[FriendsList objectAtIndex:0] forKey:@"testFriend"];
[encoder encodeObject:_userPSW forKey:@"userpassword"];
[encoder encodeObject:UIImagePNGRepresentation(userImg) forKey:@"userImg"];
[encoder encodeObject:userID forKey:@"userID"];
[encoder encodeObject:groups forKey:@"groups"];
[encoder encodeObject:_email forKey:@"email"];

}

- (id)initWithCoder:(NSCoder *)decoder {
currentUser *returnUser = [[currentUser alloc] init];
returnUser.username = [decoder decodeObjectForKey:@"username"];
returnUser.email = [decoder decodeObjectForKey:@"email"];
//testing direct friend loading
Friend *testFriend = [decoder decodeObjectForKey:@"testFriend"];
returnUser.userPSW = [decoder decodeObjectForKey:@"userpassword"];
returnUser.userImg = [UIImage imageWithData:[decoder decodeObjectForKey:@"userImg"]];
returnUser.FriendsList = [decoder decodeObjectForKey:@"FriendsList"];
returnUser.userID = [decoder decodeObjectForKey:@"userID"];
returnUser.groups = [decoder decodeObjectForKey:@"groups"];

return returnUser;
}

friend .m

- (void)encodeWithCoder:(NSCoder *)encoder{  
[encoder encodeObject:UIImagePNGRepresentation(userImg) forKey:@"friendIMG"];
[encoder encodeObject:username forKey:@"friendUN"];
[encoder encodeObject:userID forKey:@"friendID"];

}

- (id)initWithCoder:(NSCoder *)decoder{
Friend *obj = [[Friend alloc]init];
obj.username = [decoder decodeObjectForKey:@"friendUN"];
obj.userImg = [UIImage imageWithData:[decoder decodeObjectForKey:@"friendIMG"]];
obj.userID = [decoder decodeObjectForKey:@"friendID"];
return obj;

}

这是我必须保存和加载 CurrentUser 的对象,称为“配置”。配置.h

#import "currentUser.h"
@interface configurations : NSObject
- (currentUser*)loadCustomObject;
- (void)saveCustomObject:(currentUser *)object;

@end

Configurations.m

#import "configurations.h"

@implementation configurations
- (void)saveCustomObject:(currentUser *)object {
NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:object];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:encodedObject forKey:@"lastUser"];
[defaults synchronize];

}

- (currentUser*)loadCustomObject {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *encodedObject = [defaults objectForKey:@"lastUser"];
currentUser *object = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject];
return object;
}
@end

这就是我加载 CurrentUser 的方式。

saver = [[configurations alloc]init];
currentUser *tmpUser = [saver loadCustomObject];
thisUser = [currentUser instance];

static dispatch_once_t once;
dispatch_once(&once, ^ {
if(tmpUser != nil){
if(![tmpUser.username isEqualToString:@""]){


for(Friend *savedFriend in tmpUser.FriendsList)
{
[thisUser addFriend:savedFriend];
}
thisUser.username = tmpUser.username;
thisUser.email = tmpUser.email;
thisUser.userID = tmpUser.userID;
thisUser.userPSW = tmpUser.userPSW;
thisUser.userImg = tmpUser.userImg;
});

最佳答案

您的initWithCoder: 方法不正确。它们需要采用以下模式:

- (instancetype)initWithCoder:(NSCoder *)decoder {
self = [super init]; // or [super initWithCoder:decoder] if appropriate
if (self) {
_someIvar = [decoder decodeObjectForKey:@"someKey"];
_someOtherIvar = [decoder decodeObjectForKey:@"someOtherKey"];
}

return self;
}

CurrentUserFriend 类修复 initWithCoder: 方法会有很大帮助。

当前用户:

- (id)initWithCoder:(NSCoder *)decoder {
self = [super init];
if (self) {
_username = [decoder decodeObjectForKey:@"username"];
_email = [decoder decodeObjectForKey:@"email"];
//testing direct friend loading
Friend *testFriend = [decoder decodeObjectForKey:@"testFriend"];
_userPSW = [decoder decodeObjectForKey:@"userpassword"];
_userImg = [UIImage imageWithData:[decoder decodeObjectForKey:@"userImg"]];
_FriendsList = [decoder decodeObjectForKey:@"FriendsList"];
_userID = [decoder decodeObjectForKey:@"userID"];
_groups = [decoder decodeObjectForKey:@"groups"];
}

return self;
}

friend :

- (id)initWithCoder:(NSCoder *)decoder {
self = [super init];
if (self) {
_username = [decoder decodeObjectForKey:@"friendUN"];
_userImg = [UIImage imageWithData:[decoder decodeObjectForKey:@"friendIMG"]];
_userID = [decoder decodeObjectForKey:@"friendID"];
}

return self;
}

关于ios - 使用自定义对象保存 NSMutableArray 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30564893/

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