Доступ к полям NSManagedObject с помощью свойств KVC / valueForKey и vs - что лучше? - PullRequest
4 голосов
/ 27 июня 2010

Написание моего первого приложения с CoreData.Книга, которую я использую для руководства, имеет следующий код:

// 'Person' is my managed object class
Person *newPerson = [NSEntityDescription
  insertNewObjectForEntityForName:@"Person"
  inManagedObjectContext:self.managedObjectContext];

[newPerson setValue:nameField.text forKey:@"name"];

В книге говорится, что использование стиля свойств, например,

newPerson.name = nameField.text;

, также работает, но "это такОчень часто код Core Data использует подход KVC "

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

При этом я хотел бы изучить свои привычки сейчас относительно "способа iPhone" в выполнении дел.

Есть ли разница в этих подходах, и, если большинство людей используют первый, KVC, подход ... почему?

Ответы [ 3 ]

3 голосов
/ 27 июня 2010

Большинство людей не используют подход KVC, который я видел;Я не, по причинам, которые вы описываете.

Чтобы сохранить ваше здравомыслие, используйте Mogenerator для создания ваших аксессоров:

http://rentzsch.github.com/mogenerator/

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

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

Я обычно генерирую все классы модели данных в подкаталоге под названием Classes под названием «DataObjects» - тогда вы можете просто заново добавлять весь этот каталог каждый раз, когда вы восстанавливаете классымодель данных, которая приводит к созданию новых классов (когда у вас есть новые сущности).Пример запуска командной строки выглядит следующим образом:

 mogenerator -m ../MyProject.xcdatamodeld/MyProject-v1.xcdatamodel

, который генерирует классы в текущий каталог из данной модели данных (в этом случае у меня есть версионная модель только с первой версией).

1 голос
/ 27 июня 2010

Свойства приведут к незначительному увеличению производительности по сравнению с прямым использованием KVC.Однако KVC имеет свои особенности, особенно при работе с keyPath, а не с key.

KVC также полезен при обнаружении или динамическом доступе к значениям объекта.

Для повседневного использования Kendall определенно прав, используйте mogenerator и используйте свойства.Легче кодировать, легче поддерживать и т. Д. Однако KVC определенно имеет свое место и чрезвычайно полезен.

0 голосов
/ 27 июня 2010

name является свойством NSEntityDescription, поэтому newPerson.name в порядке.

Но когда вы добавляете пользовательское свойство к вашей пользовательской сущности, оно известно только во время выполнения - поэтому newPerson.favouriteRestaurant вызовет предупреждение во время компиляции, даже если оно нормально.

Это раздражает.

Один из способов избавиться от него - использовать

[newPerson setValue:@"Crazy Maria's" forKey:@"favouriteRestaurant"]

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

...