2015-06-01 2 views
0

У меня есть класс под названием CurrentUser, который содержит NSMutableArray под названием listOfFriends. В этом listOfFriends хранятся объекты класса Friends.Проблемы с сохранением NSMutableArray с настраиваемыми объектами

Оба класса 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; 
} 

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.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; 
}); 
+0

Где вы определяете FriendsList свойство? – Dash

+0

Кстати, в объекте-c стандартно капитализировать имена классов, но не имена свойств/переменных. – Dash

+0

Я определяю свойство FriendsList в CurrentUser.h как: @property (неатомный, сильный) NSMutableArray * FriendsList; –

ответ

2

Неверные методы 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 классов помогут много.

CurrentUser:

- (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; 
} 
Смежные вопросы