Передача Bluetooth для основных объектов данных - PullRequest
1 голос
/ 21 января 2010

Как мне использовать bluetooth для передачи основного объекта данных с соответствующими отношениями? У меня есть три основных объекта данных с настроенными обратными отношениями, и все это прекрасно работает, но мне нужно перенести их на другой iPhone, основываясь на том контексте, что его нет в соответствующей таблице в основном объекте данных, установленном на другом iPhone. Я знаю, как передавать простые вещи, такие как строки и целые числа через Bluetooth, но это на совершенно новом уровне, и я начал программировать для iPhone только около 4 месяцев назад. Спасибо за вашу помощь вам, эксперты!

EDIT:

Спасибо, но по какой-то причине я продолжаю получать эту ошибку! Что мне делать?

2010-02-12 21:24:14.907 PitScout[92918:207] Failed to call designated initializer on NSManagedObject class 'Team' 
2010-02-12 21:24:14.907 PitScout[92918:207] *** -[Team setTeamNumber:]: unrecognized selector sent to instance 0x112b630
2010-02-12 21:24:14.908 PitScout[92918:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[Team setTeamNumber:]: unrecognized selector sent to instance 0x112b630'

Спасибо.

Ответы [ 3 ]

2 голосов
/ 13 февраля 2010

Попытка сериализации NSManagedObject экземпляров потерпит неудачу, поскольку они напрямую связаны с NSManagedObjectContext, из которого они получены.

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

Как только вы получите их в промежуточном формате и отправите по проводам, вы можете легко преобразовать их в пункт назначения NSManagedObjectContext без проблем.

2 голосов
/ 21 января 2010

Вам нужно будет каким-то образом сериализовать ваши объекты для переноса, а затем повторно вставить в контекст на другой стороне. Я предлагаю изучить протокол NSCoding и примеры, которые позволят вам использовать NSKeyedArchiver и NSKeyedUnarchiver для сериализации ваших объектов в NSData для передачи (или base64, закодированного в NSString, если необходимо).

Сначала убедитесь, что ваш объект модели реализует NSCoding:

@interface MyObject :  NSManagedObject <NSCoding>

И затем реализуйте следующие методы в вашем объекте модели для обработки кодирования и декодирования объектов:

-(id)initWithCoder:(NSCoder*)coder
{
    if (self = [self init])
    {
        self.myProperty = [coder decodeObjectForKey:@"myProperty"];
    }

    return self;
}

-(void)encodeWithCoder:(NSCoder*)coder
{
    [coder encodeObject:self.message forKey:@"myProperty"];
}

Используйте NSKeyedArchiver для сериализации вашего объекта до NSData:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myObject];

Используйте NSKeyedUnarchiver для десериализации:

MyObject *myObject = (MyObject *)[NSKeyedUnarchiver unarchiveObjectWithData:myData];

Если требуется строка, вам придется кодировать и декодировать base64 NSData, подробности см. В этом посте: Как выполнить кодирование base64 на iphone-sdk?

1 голос
/ 03 января 2011

Это может быть слишком сложно для этого, но метод, который мне еще не удалось, - это SLIP, RFC 1055, версия 1988 года. В течение многих лет я использовал его, чтобы отобразить блоки данных в 7 или 8-битный поток ASCII для передачи по всем носителям, с которыми я столкнулся. Затем использовали обратную или некоторую его модификацию, чтобы преобразовать поток обратно в необходимую конфигурацию на другом конце. Примеры кода на C есть в RFC. Я всегда использовал предложение Фила Карна использовать один и тот же символ для начала и конца пакета.

Таким образом, для работы с потоком требуется только одна подпрограмма. Он поглощает символы до тех пор, пока не встретится SOP / EOP. Это было выбрано для борьбы с шумом, который может накапливаться на входе радиолиний, когда они бездействуют в ожидании данных. Фил говорит об этом в других работах.

Я обычно использую \ x0D или \ x0A, для которых когда-либо используется система, на которой работают средства отладки, в качестве возврата каретки, а в качестве escape-символа используется всегда популярная обратная косая черта '\'. Время от времени удобно использовать другой управляющий код или использовать различные значения для управляющих символов, чтобы уменьшить размер пакета. Использование системы as позволяет использовать терминальную программу с добавленным кодом для SLIP и несколькими модификациями для работы в качестве монитора и инструмента для ввода пакетов в поток вручную.

Я всегда обнаруживал, что у меня достаточно вариантов, если первый символ в пакете указывает параметры на другом конце. Конечно, должна быть обеспечена некоторая форма проверки ошибок и / или восстановления после ошибок и возможность повторной передачи пакета MUNGED. Для небольших пакетов данных, передаваемых по высоконадежным каналам связи, можно использовать простую контрольную сумму, или в случае передач с использованием трех минерализованных вулканов в качестве мест антенн, которые расположены немного дальше, чем хотелось бы, чтобы алгоритм коррекции ошибок Fowarad с высокой степенью избыточности находился у себя дома.

SLIP достаточно универсален, чтобы брать данные из 16-битной Motorola 68HC11 и восстанавливать их в 32-битной системе Intel, если программист меняет окончание и заботится о смещении между 16 и 32-битными данными.

Gordon

Гордон Кугер Стиллуотер, хорошо

...