Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS - Attempt to insert non-property list object NSDictionary in NSUserDefaults

In my app, I need to save my custom User object NSDictionary in my NSUserDefaults. I attempt this with the following code:

NSDictionary *userObjectDictionary = response[@"user"];
NSLog(@"USER OBJECT:\n%@", userObjectDictionary);
[defaults setObject:userObjectDictionary forKey:@"defaultUserObjectDictionary"];
[defaults synchronize];

This attempt crashes my app with the following message:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object {type = immutable dict, count = 10, entries => 0 : status_id = 1 : {contents = "first_name"} = exampleFirstName 3 : id = {value = +2, type = kCFNumberSInt64Type} 4 : {contents = "profile_picture"} = {contents = "http://myDevServer.com/pictures/userName.jpg"} 5 : last_name = exampleLastName 7 : email = {contents = "[email protected]"} 8 : {contents = "badge_count"} = {value = +0, type = kCFNumberSInt64Type} 9 : user_name = userName 10 : {contents = "phone_number"} = {contents = "0123456789"} 12 : {contents = "status_updated_at"} = } for key defaultUserObjectDictionary'

This is what my User object dictionary looks like before I attempt to save it:

{
    "badge_count" = 0;
    email = "[email protected]";
    "first_name" = exampleFirstName;
    id = 2;
    "last_name" = exampleLastName;
    "phone_number" = 0123456789;
    "profile_picture" = "http://myDevServer.com/pictures/userName.jpg";
    "status_id" = "<null>";
    "status_updated_at" = "<null>";
    "user_name" = userName;
}

Is it crashing because there a null values in my User object NSDictionary? I tried with a regular NSDictionary with dummy data with null values and it worked. If this is the problem, how to I bypass this? Sometimes my User object will have properties that are nullable.

like image 374
Rafi Avatar asked Feb 19 '16 02:02

Rafi


2 Answers

Some of your objects or keys in dictionary have class, that doesn't support property list serialization. Please, see this answer for details: Property list supported ObjC types

I recommend to check object for key "profile_picture" - it may be NSURL.

If that doesn't help, you may use following code to identify incompatible object:

for (id key in userObjectDictionary) {
    NSLog(@"key: %@, keyClass: %@, value: %@, valueClass: %@",
          key, NSStringFromClass([key class]),
          userObjectDictionary[key], NSStringFromClass([userObjectDictionary[key] class]));
}
like image 85
Borys Verebskyi Avatar answered Sep 20 '22 20:09

Borys Verebskyi


NSNull is acceptable in JSON (as "<null>"), but not listed in the property lists. So one solution is to transform the dictionary to NSData and save it. enter image description here

like image 22
Andy Darwin Avatar answered Sep 22 '22 20:09

Andy Darwin