使用自定义对象保存 NSMutableArray 时出现问题
Problems Saving NSMutableArray with custom objects
我有一个名为 CurrentUser
的 class,其中包含一个名为 listOfFriends
的 NSMutableArray
。此 listOfFriends
包含来自 class Friends
.
的对象
CurrentUser
和 Friend
class 都处理了 NSCoding
协议。
Friend
对象有一个名为 userImg
的 属性,它是一个 UIImage
。
只有一个问题。
当我尝试加载 lisOfFriends
时,朋友们没有带着他们的 UIImages
。
如果我保存了任何朋友,然后尝试重新加载它,它带有 UIImage
没有问题。但如果对象在 listOfFriends
内,它不会随 UIImage
一起提供,但所有其他信息都正确加载。
我的问题是:如何存储和加载带有自定义对象的 NSMutableArray
?
friendList声明:
CurrentUser.h
@property (nonatomic,strong)NSMutableArray *FriendsList;
CurrentUser.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 的对象,它叫做 "Configurations"。
Configurations.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;
}
修复 CurrentUser
和 Friend
类 的 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;
}
朋友:
- (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;
}
我有一个名为 CurrentUser
的 class,其中包含一个名为 listOfFriends
的 NSMutableArray
。此 listOfFriends
包含来自 class Friends
.
CurrentUser
和 Friend
class 都处理了 NSCoding
协议。
Friend
对象有一个名为 userImg
的 属性,它是一个 UIImage
。
只有一个问题。
当我尝试加载 lisOfFriends
时,朋友们没有带着他们的 UIImages
。
如果我保存了任何朋友,然后尝试重新加载它,它带有 UIImage
没有问题。但如果对象在 listOfFriends
内,它不会随 UIImage
一起提供,但所有其他信息都正确加载。
我的问题是:如何存储和加载带有自定义对象的 NSMutableArray
?
friendList声明:
CurrentUser.h
@property (nonatomic,strong)NSMutableArray *FriendsList;
CurrentUser.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 的对象,它叫做 "Configurations"。 Configurations.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;
}
修复 CurrentUser
和 Friend
类 的 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;
}
朋友:
- (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;
}