Подтвердить что ты не робот

Xcode 7 генерирует основной объект данных с дополнительной категорией CoreDataProperties

У меня есть странная новая функция в xcode 7, когда я создаю новый подкласс NSManagedObject, тогда xcode создает два класса: entity и их категорию CoreDataProperties, которые содержат полную реализацию. На рисунке ниже пример, что я имею в виду.

введите описание изображения здесь

Я не могу найти документальную информацию об этом, кто может объяснить, почему он работает, поэтому

4b9b3361

Ответ 1

Я только что заметил это, а также не смог найти документацию об этом, но я экспериментировал с этой новой функцией, и она работает именно так. Когда вы сначала создаете подкласс NSManagedObject из вашей модели Core Data, тогда Xcode будет генерировать 4 файла:

DBUser.h

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

NS_ASSUME_NONNULL_BEGIN

@interface DBUser : NSManagedObject

// Insert code here to declare functionality of your managed object subclass

@end

NS_ASSUME_NONNULL_END

#import "DBUser+CoreDataProperties.h"

DBUser.m

#import "DBUser.h"

@implementation DBUser

// Insert code here to add functionality to your managed object subclass

@end

DBUser + CoreDataProperties.h

#import "DBUser.h"

NS_ASSUME_NONNULL_BEGIN

@interface DBUser (CoreDataProperties)

@property (nullable, nonatomic, retain) NSNumber *id;
@property (nullable, nonatomic, retain) NSString *name;

@end

NS_ASSUME_NONNULL_END

DBUser + CoreDataProperties.m

#import "DBUser+CoreDataProperties.h"

@implementation DBUser (CoreDataProperties)

@dynamic id;
@dynamic name;

@end

Итак, как вы теперь видите, все свойства находятся в отдельном файле с категорией (CoreDataProperties). Позже, если вы создадите подкласс NSManagedObject для той же модели, Xcode 7 будет регенерировать только 2 файла с категорией (DBUser + CoreDataProperties.h и DBUser + CoreDataProperties.m), чтобы обновить все свойства вашей модели, но он не внесет никаких изменений в 2 других файла (DBUser.h и DBUser.m), чтобы вы могли использовать эти 2 файла, чтобы добавить туда некоторые пользовательские методы или свойства и т.д.

В предыдущей версии Xcode генерировал только 2 файла (DBUser.h и DBUser.m), и он помещал свойства там, поэтому вы не могли легко изменить эти файлы, потому что ваша пользовательская реализация была удалена каждый раз, когда вы восстанавливали свои подклассы. Поэтому было обычной практикой вручную создавать категорию и помещать ваши методы в вашу категорию, которая была неочевидна для того, что мы можем видеть в Xcode 7. Это, однако, имело много недостатков, потому что нам приходилось использовать категорию для реализации наших методов, которая не позволяют делать определенные вещи, и теперь мы можем легко модифицировать основные файлы интерфейса и реализации, что позволяет нам что-то делать с ним. Ура!

Ответ 2

Ранее сгенерированный код перешел в EntityName.h и EntityName.m, которые вам пришлось "расширять" с помощью интерфейса, такого как EntityName + Create.h и EntityName + Create.m.

Это было трудно понять для новичков, которые часто меняли класс EntityName.m и теряли свой код.

Теперь это правильно: генератор кода не стирает существующий код.

Другие ответы очень полезны для объяснения новой системы.

Но никто не говорит о новой проблеме совместимости, если у вас есть сущности, основанные на старой системе.

Мое решение: я по-прежнему помещаю свой собственный код в EntityName + Create.m, но в EntityName + Create.h я ссылаюсь только на EntityName + CoreDataProperties.h, а не только на EntityName.h(я опустошил ранее сгенерированный код в EntityName. ч и EntityName.m). Это решение не позволило мне переместить мой код из EntityName + Create.m и изменить все ссылки на EntityName + Create.h.

Надеюсь, это помогло вам.

Ответ 3

Для Swift и Xcode 7 это то же самое, что и ответ от Leszek S, но изначально создаются только 2 файла:

  • DBUser.swift
  • DBUser + CoreDataProperties.swift

Позже, если вы вносите изменения в модель CoreData и регенерируете подкласс NSManagedObject, обновляется только DBUser+CoreDataProperties.swift. DBUser.swift остается нетронутым.

Итак, поместите весь свой код в DBUser.swift.