Преобразование строки в базовые данные с помощью NSValueTransformer - PullRequest
2 голосов
/ 18 февраля 2012

Я пытаюсь использовать базовые данные NSValueTransformer для преобразования NSArray в NSString. Я не уверен, можно ли его заархивировать, но я видел официальный документ Apple, показывающий фрагмент кода:

@interface ClassNameTransformer: NSValueTransformer {}
@end
@implementation ClassNameTransformer
+ (Class)transformedValueClass { return [NSString class]; }
+ (BOOL)allowsReverseTransformation { return NO; }
- (id)transformedValue:(id)value {
  return (value == nil) ? nil : NSStringFromClass([value class]);
}
@end

Кажется, он может хранить данные в NSString (может быть, я неправильно понял ..), поэтому я попытался, как показано ниже:

@implementation ArrayToStringTransformer

+ (BOOL)allowsReverseTransformation {
  return YES;
}

+ (Class)transformedValueClass {
  return [NSString class];
}

- (id)transformedValue:(id)value {
//  return NSStringFromClass([value class]);
//  return NSStringFromClass([@"11" class]);

  NSLog(@"!!!!!! %@, %@", NSStringFromClass([value class]), value);
  if ([value isKindOfClass:[NSString class]])
    return NSStringFromClass([value class]);

  NSMutableString * string = [NSMutableString string];
  for (NSNumber * number in value)
    [string appendString:[NSString stringWithFormat:@"%@,", number]];
  return string;
}

- (id)reverseTransformedValue:(id)value {
  NSArray * array = [value componentsSeparatedByString:@","];
  return array;
}

@end

Однако произошел сбой с ошибкой, приведенной ниже (включает NSLog):

[26364:11903] !!!!!! __NSCFString, 0,0
[26364:11903] -[__NSCFString bytes]: unrecognized selector sent to instance 0x905f620
[26364:11903] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString bytes]: unrecognized selector sent to instance 0x905f620'

Есть идеи? Пожалуйста !!


EDIT:

Ну, я просто преобразую NSArray в NSData, и если это тип NSString, сначала преобразуйте его в NSArray, затем в NSData, и он будет работать:

+ (Class)transformedValueClass {
  return [NSArray class];
}

- (id)transformedValue:(id)value {
  if (! [value isKindOfClass:[NSString class]])
    return [NSKeyedArchiver archivedDataWithRootObject:value];

  NSLog(@"!!! Convert NSString to NSArray");
  NSArray * array = [value componentsSeparatedByString:@","];
  NSData * data = [NSKeyedArchiver archivedDataWithRootObject:array];
  return data;
}

- (id)reverseTransformedValue:(id)value {
  return [NSKeyedUnarchiver unarchiveObjectWithData:value];
}

!!! Внимание здесь

Но мне интересно, правильный ли это путь? Как видите, я return [NSArray class] в transformedValueClass методе, но на самом деле возвращаю NSData значение типа данных в transformedValue:.

Яблочный док сказал:

Объект NSData, содержащий закодированную форму графа объектов, корневым объектом которого является rootObject

Я в полном замешательстве ...

1 Ответ

2 голосов
/ 18 января 2016

В настоящее время Базовые данные могут преобразовываться только в NSData. Преобразователь по умолчанию может обрабатывать преобразование массива строк в NSData, устанавливая тип атрибута в трансформируемый, и это единственная требуемая конфигурация.

Лично я хотел бы, чтобы Core Data в будущем разрешил преобразование в строку, поэтому, например, при использовании браузера SQLite поле записи читается человеком, а не является двоичным списком.

Одна теория, почему они, возможно, не включили эту функцию, состоит в том, что если вы пытаетесь включить массив строк, то вам, вероятно, было бы лучше использовать отношение «многие ко многим» для реализации того, что вы пытаетесь хранить вместо этого. .

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