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

Problems Saving NSMutableArray with custom objects

我有一个名为 CurrentUser 的 class,其中包含一个名为 listOfFriendsNSMutableArray。此 listOfFriends 包含来自 class Friends.

的对象

CurrentUserFriend 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;
}

修复 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;
}

朋友:

- (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;
}