CoreData, JSON "нераспознанный селектор отправлен на экземпляр" - PullRequest
1 голос
/ 19 ноября 2010

Я пытаюсь проанализировать JSON для моего приложения. При попытке установить значение «имя» я получаю ошибку unrecognized selector sent to instance'.
Это строка кода, в которой происходит ошибка: self.name = [json_object objectForKey:@"name"]; (json_object - это NSDictionary, а "self" - это объект в CoreData)

Мой JSON выглядит так:

json_object: {
draftstatus = "isdraftfull.php";
getcard = "getcard.php";
getpack = "getpack.php";
imageextension = ".jpg";
images = "images/small/";
joindraft = "joindraft.php";
joindraftmenu = "getjoindraftmenu.php";
login = "loginasuser.php";
name = "the server";
passpack = "passpack.php";
playerdraftstatus = "getplayerdraftstatus.php";
signup = "signup.php";
userexists = "checkifuserexists.php";
usesetidforimagepath = false;
}

Server.h выглядит так:

#import <CoreData/CoreData.h>
#import "JSON.h"

@interface Server :  NSManagedObject  
{   
    NSMutableData *responseData;
}

@property (nonatomic, retain) NSString * playerdraftstatus;
@property (nonatomic, retain) NSString * signup;
@property (nonatomic, retain) NSNumber * usesetidforimagepath;
@property (nonatomic, retain) NSString * login;
@property (nonatomic, retain) NSString * imageextension;
@property (nonatomic, retain) NSString * userexists;
@property (nonatomic, retain) NSString * getcard;
@property (nonatomic, retain) NSString * passpack;
@property (nonatomic, retain) NSString * draftstatus;
@property (nonatomic, retain) NSString * joindraftmenu;
@property (nonatomic, retain) NSString * getpack;
@property (nonatomic, retain) NSString * joindraft;
@property (nonatomic, retain) NSString * images;
@property (nonatomic, retain) NSNumber * isdefaultserver;
@property (nonatomic, retain) NSString * root;
@property (nonatomic, retain) NSString * name;

- (id) initWithWebAddress:(NSString *) address;
- (id) initWithWebAddressAsyn:(NSString *) address;
- (void) fillFromJSON:(NSDictionary *) json_object;
- (void) saveServer;

@end

Я считаю, что это работало несколько дней назад, но я не помню. Когда я начал работать над этим сегодня, я добавил «корневой» объект. Он компилируется без ошибок, но не анализирует этот json.

Помощь

EDIT
Я изменил JSON, чтобы вернуться с name = "the server", и когда я регистрирую это, как это NSLog(@"json_object name: %@", [json_object objectForKey:@"name"]);, журнал говорит json_object name: the server, но я все еще получаю ту же ошибку, когда пытаюсь установить для этого self.name, который имеет тип String.
Я заметил, что иногда при проверке версии JSON для Log-файла значение внутри имени не всегда заключено в кавычки, и, как видно из журнала [json_object objectForKey:@"name"], оно отображается без кавычек. Это проблема и почему это происходит? Если я посмотрю на json прямо на веб-странице, которая его выводит, ВСЕГДА есть кавычки вокруг значения.

РЕДАКТИРОВАТЬ 2
Полная ошибка выглядит следующим образом:

-[Server setName:]: unrecognized selector sent to instance 0x61036e0
2010-11-19 15:46:10.113 TCGDraft[57953:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Server setName:]: unrecognized selector sent to instance 0x61036e0'
*** Call stack at first throw:

РЕДАКТИРОВАТЬ 3
Я сделал NSLog на "себя", и это то, что возвращается self: <Server: 0x6143190> (entity (null); id: (null) ; data: {})
Я понятия не имею, если это то, что нормально, хотя. Это объект CoreData, и у меня есть ощущение, что я мог как-то испортить его.

РЕДАКТИРОВАТЬ 4
Я вернулся и посмотрел на код для создания объекта сервера из CoreData следующим образом:

Server *server = [NSEntityDescription
                  insertNewObjectForEntityForName:@"Server"
                  inManagedObjectContext:context];  

Когда я запустил это, я теперь получаю ошибку, которая просто говорит EXC_BAD_ACCESS, так что похоже, что какой-то объект испортился ... но я не знаю как.

РЕДАКТИРОВАТЬ 5
Правильно, поэтому я полностью удалил файлы Server.h и Server.m со своим пользовательским кодом, я воссоздал их из объекта CoreData и попробовал тот код, который я разместил в «Редактировать 4», и я ВСЕ ЕЩЕ получаю ту же ошибку о EXC_BAD_ACCESS ... так что теперь я, очевидно, ушел НАЗАД, а не вперед.

Ответы [ 2 ]

3 голосов
/ 20 ноября 2010

Во-первых, я предлагаю вам полностью отделить NSManagedObject от ваших методов синтаксического анализа JSON.Вся асинхронная загрузка и обработка ваших данных JSON должна рассматриваться в отдельном объекте, который вы затем можете назначить свойствам вашего управляемого объекта.

#import <CoreData/CoreData.h>

@interface Server :  NSManagedObject  
{   
}

@property (nonatomic, retain) NSString * playerdraftstatus;
@property (nonatomic, retain) NSString * signup;
...
@property (nonatomic, retain) NSString * name;

@end

Во-вторых, НЕ меняйте @dynamic значения обратно на @синтезировать иначе CoreData не сможет манипулировать и сохранять эти объекты для вас (скорее всего, поэтому вы получаете исключение EXEC_BAD_ACCESS при попытке сохранить объект!).

@dynamic *playerdraftstatus;
@dynamic *signup;
...
@dynamic *name;

Теперь попробуйте назначить атрибутзначения из контроллера, где вы создаете свой объект Server, т.е.

Server *server = [NSEntityDescription
                  insertNewObjectForEntityForName:@"Server"
                  inManagedObjectContext:context];  

server.name = [json_object valueForKey:@"name"];

И, наконец, убедитесь, что вы никогда не освободите объект сервера, поскольку CoreData позаботится об этом автоматически.

PS: если вы изменили модель данных, вам может потребоваться сбросить / удалить приложение с iPhone / Simulator, в противном случае вы получите сообщение об ошибке, в котором говорится, что тип магазина несовместим с существующим на телефоне и т. Д.

Дайте мне знать, как вы поступите, и если вы получите дальнейшие сообщения об ошибках.

Приветствия,

Rog

0 голосов
/ 20 ноября 2010

Проблема в том, что у вас нет метода setName в вашем классе Server. Это не имеет ничего общего с данными JSON. Убедитесь, что вы синтезировали свои свойства или иным образом определили необходимые методы.

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