Каков наилучший подход для преобразования неизменяемых объектов в изменяемые (рекурсивные)? - PullRequest
10 голосов
/ 04 декабря 2011

В частности, эта проблема возникла у меня, когда я сделал запрос в AFNeworking с JSONkit и получил (id) JSON с несколькими вложенными массивами и словарями.

Если я не хочу изменять данные, у меня нет проблем:

self.myNSArray = [JSON objectForKey:@"result"];

Но если я хочу изменить данные, я должен сохранить их в изменяемой переменной:

self.myNSMutableArray = [[JSON objectForKey:@"result"] mutableCopy];

Последний не преобразует вложенные массивы или словари в изменяемые данные; это работает только для первого уровня.

Единственный путь, который я нашел, - по этой ссылке рекурсивные изменяемые объекты ; но я не знаю, есть ли лучший способ решить эту проблему.

Заранее спасибо.

Ответы [ 3 ]

11 голосов
/ 04 декабря 2011

Вы можете использовать функцию CoreFoundation CFPropertyListCreateDeepCopy с параметром изменчивости kCFPropertyListMutableContainersAndLeaves:

NSArray *immutableArray = [JSON objectForKey:@"result"];
self.myMutableArray = [(NSMutableArray *)CFPropertyListCreateDeepCopy(NULL, immutableArray, kCFPropertyListMutableContainersAndLeaves) autorelease];
5 голосов
/ 02 июля 2013

на дуге:

CFBridgingRelease(CFPropertyListCreateDeepCopy(NULL, (__bridge CFPropertyListRef)(immutableArray), kCFPropertyListMutableContainersAndLeaves))

действительно сработало. Спасибо brainjam.

0 голосов
/ 27 октября 2016

Убедитесь, что вы позаботились о значениях null в строке ответа, иначе он вернет вам ноль, что приведет к ужасным результатам.

(Например, попробуйте мутационный ответ от http://www.json -generator.com / API / JSON / прибудет / bQVoMjeJOW? Отступ = 1 )

Просто поместите ниже строки при преобразовании ответа API в JSON Object.

responseString=[responseString stringByReplacingOccurrencesOfString:@"\":null" withString:@"\":\"\""];//To Handle Null Characters

//Search for below line in your parsing library and paste above code
data = [responseString dataUsingEncoding:NSUTF8StringEncoding];

Таким образом, в вашем объекте JSON не будет нулевых символов, следовательно, нет проблем с использованием CFPropertyListCreateDeepCopy.

Ура !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...