Сохранение NSManagedObjectContext на Stackmob - загружает на сервер, но приложение вылетает

У меня возникла проблема с использованием StackMob в качестве бэкэнда моего приложения iOS (хотя я не уверен, что это проблема неправильного использования методов StackMob или проблемы iOS).

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

[NSManagedObjectContext saveOnSuccess:<^(void)successBlock> onFailure:<^(NSError *error)failureBlock>];

Здесь я использую метод StackMob для асинхронного сохранения MOC, найденного в справочнике категорий NSManagedObjectContext(Concurrency).

Представление, предшествующее этому, выполняет выборку для последних сообщений, и в случае, когда выборка не выполняется, публикация работает нормально, но если выборка была выполнена, то при сохранении MOC для загрузки нового сообщения я получаю следующий вывод как сообщение об ошибке:

2013-09-11 17:08:09.284 imageTagging[1824:1843] -[__NSDictionaryI bytes]: unrecognized
selector sent to instance 0x1e3123d0

2013-09-11 17:08:09.291 imageTagging[1824:1843] *** Terminating app due to uncaught
exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryI bytes]: unrecognized
selector sent to instance 0x1e3123d0'

*** First throw call stack:
(0x318cb3e7 0x395c6963 0x318cef31 0x318cd64d 0x31825208 0x321631cf 0x3216b991 0x15ea99
 0x318c8757 0x15e109 0x15dabf 0x10d1c3 0x318d05b7 0x10cd4d 0x10c829 0x10923b 0x1076d9
 0x3166c431 0x316c44d1 0x1685c3 0x316c7e5d 0x399e3b3b 0x399e167d 0x399e4613 0x399e47d9
 0x39a087f1 0x39a08684)

libc++abi.dylib: terminate called throwing an exception
(lldb) 

Данные по-прежнему загружаются на сервер StackMob, и их можно вызывать при последующем запуске приложения, но при попытке сохранить приложение происходит сбой. Все это выполняется в контроллере вида. Я пытался принудительно выполнить все сохранения MOC в главном потоке, но ошибка по-прежнему возникает. Я также попытался отправить "очередь на сохранение" и обновить пользовательский интерфейс после завершения сохранения. Этот метод, казалось, работал некоторое время, но затем снова возникли ошибки (возможно, это просто случайность). Я также попытался сделать это с синхронными вызовами сохранения в документации

Та же ошибка возникает при попытке выполнить и другие сохранения (например, после создания нового пользователя или при обновлении информации о пользователе), и все они сводятся к одному и тому же вызову функции, что вызывает проблемы. Также стоит отметить, что ошибка всегда одна и та же (особенно __NSDictionaryI пытается получить доступ к своему нераспознанному селектору bytes,

Вот полный вызов метода с заполненными входными параметрами:

//save context
[[[[SMClient defaultClient] coreDataStore] contextForCurrentThread] saveOnSuccess:^{
    NSLog(@"You created a new Post object!");
    [[[[SMClient defaultClient] coreDataStore] contextForCurrentThread] refreshObject:newPost mergeChanges:YES];
    NSLog(@"refreshed");
} onFailure:^(NSError *error) {
    NSLog(@"There was an error! %@", error);
}];

ОБНОВЛЕНИЕ: я сузил проблему до неправильного обращения с информацией, возвращенной из выборки, выполненной предыдущим контроллером представления. В частности, это происходит после получения результатов при попытке использовать данные для обновления.

В результате этого нового понимания вопрос, с которым я действительно сталкиваюсь, заключается в том, как правильно сохранить управляемый объект в контексте после выборки. Я считаю, что StackMob заботится о создании управляемых объектов после выборки (т. Е. Запроса к серверу). Я попытался создать новый объект из массива результатов (каждый "объект" является NSManagedObject) с:

[results enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSManagedObject *newObj = obj;
}];

Я также попытался ссылаться на полученные результаты по идентификатору объекта (каждый "объект" - это идентификатор объекта) с помощью:

[results enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSManagedObject *newObj = [self.managedObjectContext objectWithID:obj];
}];

Любая идея о том, как правильно сделать это, будет принята с благодарностью!

ОБНОВЛЕНИЕ 2: похоже, что ошибка на самом деле происходит при попытке использовать и сохранить данные геолокации. Чтобы использовать данные геолокации запрашиваемых объектов, они должны быть разархивированы, но чтобы сохранить их, они должны быть заархивированы. Я смотрю, как это сделать сейчас, и если я найду хорошее решение, я обновлю еще раз.

ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ: Понял! Оказывается, проблема, с которой я столкнулся, заключалась в том, что я разархивировал данные геолокации для обновления пользовательского интерфейса и выполнения некоторых вычислений, и пока я снова архивировал их для правильного хранения, я создал аннотацию на карте, которая ссылалась на неархивированные данные., В результате MOC поддерживал данные, которые не могли быть сохранены с помощью методов StackMob. Сохраняя только архивные данные, я могу сохранять их так часто, как хотел бы, и просто разархивировать геоданные, когда они должны быть использованы. Задача решена!

Пожалуйста, не стесняйтесь комментировать, если кто-то сталкивается с подобной проблемой и нуждается в некотором понимании или ссылках!

1 ответ

Решение

Я просто собираюсь выложить мое последнее обновление здесь в качестве ответа, так как оно объясняет, как я решил проблему.

ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ: Понял! Оказывается, проблема, с которой я столкнулся, заключалась в том, что я разархивировал данные геолокации для обновления пользовательского интерфейса и выполнения некоторых вычислений, и пока я снова архивировал их для правильного хранения, я создал аннотацию на карте, которая ссылалась на неархивированные данные., В результате MOC поддерживал данные, которые не могли быть сохранены с помощью методов StackMob. Сохраняя только архивные данные, я могу сохранять их так часто, как хотел бы, и просто разархивировать геоданные, когда они должны быть использованы. Задача решена!

Пожалуйста, не стесняйтесь комментировать, если кто-то сталкивается с подобной проблемой и нуждается в некотором понимании или ссылках!

Мораль истории, если вы сталкиваетесь с проблемами, подобными этим, убедитесь, что вы не храните ссылки на неархивированные файлы (даже если вы этого не хотите). SMGeoPoint данные в любом из ваших управляемых объектов. Он пытается сохранить те, которые вызывают проблему.

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