Проблемы с сохранением NSMutableArray с пользовательскими объектами

У меня есть класс с именем CurrentUser, который содержит класс NSMutableArray с именем listOfFriends. Этот listOfFriends содержит объекты из класса Friends.

Оба класса CurrentUser и Friend обрабатывают протоколы NSCoding. Объект Friend имеет свойство userImg, которое является UIImage. Есть только одна проблема. Когда я пытаюсь загрузить lisOfFriends, друзья не приходят со своими UIImages.

Если я сохраню любого друга и попытаюсь снова загрузить его, он без проблем получит UIImage. Но если объект находится внутри listOfFriends, он не поставляется с UIImage, но вся остальная информация загружается правильно.

Тогда мой вопрос: как я могу хранить и загружать NSMutableArray с пользовательскими объектами? Объявление списка друзей:

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

Друг.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

Конфигурации.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;
});

person Frederico Novack Amaral Pereir    schedule 01.06.2015    source источник
comment
Где вы определяете свойство FriendsList?   -  person Dash    schedule 01.06.2015
comment
Кстати, в Objective-C стандартно использовать заглавные буквы в именах классов, но не в именах свойств/переменных.   -  person Dash    schedule 01.06.2015
comment
Я определяю свойство FriendsList в CurrentUser.h следующим образом: @property (nonatomic,strong)NSMutableArray *FriendsList;   -  person Frederico Novack Amaral Pereir    schedule 01.06.2015


Ответы (1)


Ваши 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;
}

Исправление метода initWithCoder: для классов CurrentUser и Friend очень поможет.

Текущий пользователь:

- (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;
}
person rmaddy    schedule 01.06.2015