NSMutableArray не добавляет мою строку NSString

Я пытаюсь добавить NSString для NSMutableArray а затем сделать массив в NSData и сохранить его с NSUserDefaults, Но массив всегда равен нулю.

Вот мой код:

- (void)viewDidLoad {
    [super viewDidLoad];
    library = [[ALAssetsLibrary alloc] init];
    groups = [[NSMutableArray alloc] init];
    userDefaults = [[NSUserDefaults alloc] init];

    NSData *data = [userDefaults objectForKey:@"GroupArray"];

    groups = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    NSLog(@"%i", [groups count]);
}

-(IBAction)newFolder {
    if (textField.text != nil) {
        NSString *string = textField.text.capitalizedString;
        [library addAssetsGroupAlbumWithName:string
                    resultBlock:^(ALAssetsGroup *group) {
                        NSLog(@"Created a folder named: %@", group);
                    }
                    failureBlock:^(NSError *error) {
                        NSLog(@"An error occured! - %@", error);
                    }
         ];
        [groups addObject:string];
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:groups];
        [userDefaults setObject:data forKey:@"GroupArray"];

        NSLog(@"%i", [groups count]);
    }
    [self.view sendSubviewToBack:subView];
}

Когда приложение запускается, я получаю сообщение в консоли, что массив NULL, Когда я пытаюсь добавить строку NSLog(@"%i", [groups count]); всегда возвращайте 0.

Почему это происходит?

2 ответа

userDefaults = [[NSUserDefaults alloc] init];
NSData *data = [userDefaults objectForKey:@"GroupArray"];

В этом случае, data будет nil когда код выполняется в первый раз, так как еще нет свойства "GroupArray".

groups = [NSKeyedUnarchiver unarchiveObjectWithData:data];

Это вызывает groups стать nil а потому что зовет unarchiveObjectWithData: с nil в качестве аргумента вернется nil также.

И из-за всего этого, в -newFolder, [groups addObject:string] становится [nil addObject:string]Вызов метода на nil разрешено в Objective-C, так что вы не получите никаких исключений. Возвращаемое значение любого вызванного метода nil опять же nil или же 0,

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:groups];

Это вызывает data быть nil потому что группы это nil,

Итак, вы всегда звоните:

[userDefaults setObject:data forKey:@"GroupArray"];

с data = nil

Быстрое исправление: Добавить if (groups == nil) groups = [NSMutableArray array]; к началу -newFolder

По мнению метода didLoad каждый раз, когда вы инициализируете новый экземпляр NSUserDefaults и вызываете

NSData *data = [userDefaults objectForKey:@"GroupArray"]; на вновь созданном объекте

который будет возвращать ноль все время, потому что в новом экземпляре не будет никакого объекта для ключа @"GroupArray". Вместо этого замените userDefaults на одноэлементный объект [NSUserDefaults standardUserDefaults]

Измените ваш код, как показано ниже

- (void)viewDidLoad 
{
     [super viewDidLoad];
     library = [[ALAssetsLibrary alloc] init];
     NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"GroupArray"];

     groups = [NSKeyedUnarchiver unarchiveObjectWithData:data];
     if (!groups)
     {
         groups = [[NSMutableArray alloc] init];    
     }
     NSLog(@"group %@", groups);
     NSLog(@"%i", [groups count]);
}     

Ваш метод newFolder

  -(IBAction)newFolder 
  {
     if (textField.text != nil) 
     {
          NSString *string = textField.text.capitalizedString;
         [library addAssetsGroupAlbumWithName:string
                     resultBlock:^(ALAssetsGroup *group) {
                         NSLog(@"Created a folder named: %@", group);
                     }
                     failureBlock:^(NSError *error) {
                         NSLog(@"An error occured! - %@", error);
                     }
          ];
        [groups addObject:string];
         NSData *data = [NSKeyedArchiver archivedDataWithRootObject:groups];

        [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"GroupArray"];
        [[NSUserDefaults standardUserDefaults] synchronize];

         NSLog(@"%i", [groups count]);
     }
     [self.view sendSubviewToBack:subView];
 }

Это должно работать. Как это у меня сработало.

Другие вопросы по тегам