Сохраните NSArray в KeychainItemWrapper

Я должен сохранить NSArray (который содержит NSString и BOOL) в KeychainItemWrapper, чтобы повторно использовать его в другом ViewController и сохранить его в памяти, даже если приложение закрыто.

Я уже видел этот вопрос, но он мне не поможет, потому что я не могу найти файлы SBJsonWriter.

Может кто-нибудь может мне помочь, пожалуйста?

Спасибо большое.

Хорошего дня!

2 ответа

Решение

SBJsonWriter - сторонняя библиотека JSON, популярная много лет назад, теперь в iOS есть встроенная.

Сериализуйте данные как JSON, используя собственный NSJSONSerialization, а затем запишите их в цепочку для ключей (предполагая, что kSecValueData зашифрован):

NSArray* array = ...;

NSData* jsonData = [NSJSONSerialization dataWithJSONObject:array options:0 error:nil];
NSString* jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

[keychainItem setObject:jsonString forKey:(__bridge id)kSecValueData];

Чтобы прочитать данные обратно в NSArray:

NSString* jsonString = [keychainItem objectForKey:(__bridge id)kSecValueData];
NSArray* array = nil;

if(jsonString.length > 0)
{
    id jsonObject = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];

    //  Type check because the JSON serializer can return an array or dictionary
    if([jsonObject isKindOfClass:[NSArray class]])
        array = jsonObject;
}

//  use your array variable here, it may be nil

Вы можете использовать класс NSJSONSerialization от Apple, чтобы сделать то, что ваш связанный ответ использует SBJsonWriter.

Пример:

NSData* jsonData = [NSJSONSerialization dataWithJSONObject:myArray options:0 error:&error];
NSString* jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

Затем запишите jsonString в свою цепочку для ключей.

Чтобы полностью изменить процесс, извлеките jsonString из цепочки для ключей и сделайте следующее:

NSArray* myArray = [NSJSONSerialization JSONObjectWithData:jsonString options:0 error:&error];
Другие вопросы по тегам