Cocoa Основные данные новизны

Я - одна из величайших немытых масс разработчиков .NET, которые хотят попробовать свои силы в разработке Mac OS X. В настоящий момент я пытаюсь выяснить различные элементы Cocoa и немного зацикнуться на Core Data.

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

Может ли кто-нибудь указать мне в правильном направлении, будь то онлайн-материал или книги, которые могут дать мне подробную инструкцию по разным битам? Возможно, я застрял в мире .NET, но я все еще думаю с точки зрения уровня доступа к данным и т.д. Я хотел бы знать основы "CRUD", в создании постоянного хранилища, создании объекта, редактировании, сохранении хранить и т.д. Просто основы, не разрабатывая пользовательский интерфейс. Было бы неплохо, если бы я мог unit test различные биты.

Я предполагаю, что я пытаюсь найти правильное мышление здесь - какие-нибудь .NET-разработчики знают о соответствующих материалах для чтения для таких людей, как мы, глядя на программирование Cocoa?

Большое спасибо, Дэни.

Ответ 1

Во-первых, как указано в документации Apple (и повторяющихся комментариях от инженеров Apple), Core Data является "передовой" технологией Cocoa. Grokking Core Data требует знания множества парадигм и шаблонов Cocoa. Серьезно, сначала узнайте Cocoa. Затем напишите проект (или несколько) без Core Data. Затем изучите основные данные. Серьезно.

Чтобы успокоить ваше любопытство, я возьму удар по CRUD-ответу, хотя это не будет вашим ответом. Ответ заключается в том, что для Core Data нет шаблона CRUD, по крайней мере, не так, как вы думаете об этом. Причина в том, что Core Data не является уровнем доступа к данным. Это структура управления графами объектов. Это означает, что явная целевая работа Core Data заключается в управлении графиком экземпляров объектов. Этот график имеет ограничения (такие как мощность отношений или ограничений для отдельных атрибутов экземпляра) и правила для каскадных изменений (например, удаления) по графику. Основные данные управляют этими ограничениями. Поскольку граф объектов может быть слишком большим для хранения в памяти, Core Data предоставляет интерфейс к вашему графику объекта, который имитирует [1] весь граф объекта в памяти с помощью сбоя (экземпляры объектов не являются "ошибками", когда они сначала попадают в управляемый объектного контекста и "уволены" для легкого заполнения их атрибутов из постоянного хранилища) и uniquing (только один экземпляр в памяти экземпляра конкретного объекта (в постоянном хранилище) создается в контексте).

Основные данные просто используют постоянное хранилище на диске для реализации интерфейса большого графа объектов. В случае постоянного хранилища SQLite в этой реализации просто используется база данных, совместимая с SQL. Однако это детализация реализации. Например, вы можете создать постоянное хранилище в памяти, которое не сохраняется на диске, но позволяет Core Data управлять графиком объектов, как обычно. Таким образом, Core Data на самом деле не является уровнем доступа к данным. Думать об этом в этих терминах не хватит этой истинной силы и приведет к разочарованию. Вы не можете использовать Core Data с произвольной схемой базы данных (поэтому все учебные пособия Core Data начинаются с создания NSManagedObjectModel). Вы не должны использовать Core Data в качестве основы персистентности и использовать отдельный слой модели; вы должны использовать Core Data в качестве модельного уровня и использовать возможности Core Data для сохранения графического объекта модели на диске для вас.

Тем не менее, для создания NSManagedObjectContext (который предоставляет интерфейс графического объекта, описанный выше):

NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:[NSArray arrayWithObject:[NSBundle mainBundle]]]; // though you can create a model on the fly (i.e. in code)
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];

NSError *err;

// add an in-memory store. At least one persistent store is required
if([psc addPersistentStoreWithType:NSInMemoryPersistentStore configuration:nil URL:nil options:nil error:&err] == nil) {
  NSLog(@"%@",err);
}

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init];
[moc setPersistentStoreCoordinator:psc];

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

Чтобы добавить экземпляр объекта (продолжение с moc сверху):

NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:moc];  
//entity will be nil if MyEntity doesn't exist in moc.persistentStoreCoordinator.managedObjectModel

NSManagedObject *obj = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:moc];

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

Чтобы обновить экземпляр объекта:

[obj setValue:myValue forKey:@"attributeKey"]; //or use any method on `obj` that updates its state
NSError *err;
if(![moc save:&err]) {
  NSLog(@"%@", err); // an erro occurred in saving, perhaps due to optimistic locking failure
}

Чтобы удалить экземпляр объекта:

[moc deleteObject:obj];
if(![moc save:&err]) {
  NSLog(@"%@", err); // an erro occurred in saving, perhaps due to optimistic locking failure
}

[1]: для двоичных или XML-постоянных хранилищ весь граф сохраняется в памяти

Ответ 2

Я бы сделал следующий маршрут:

Дополнительная литература:
Как всегда: книга Cocoa Программирование для Mac OS X
Архитектура прикладных приложений (ADC)
И, наконец: A сравнение между некоторыми аспектами Cocoa и .net

Ответ 3

Core Data действительно не является уровнем доступа к данным (см. мой другой ответ для более). Но что, если вам нужен уровень доступа к данным для Cocoa? Какие у вас варианты? Я профессиональный разработчик Cocoa и Qt, и до сих пор мне удалось избежать корпоративного мира Windows или Java, поэтому моя оценка параметров может не соответствовать вашим требованиям. Исходя из экосистемы предприятия, я ожидаю, что вы найдете варианты немного страшными. Я заказывал их в том, что, как я ожидаю, будет для вас наименее страшным (примерно от наименьшего Cocoa -y, а значит, и для большинства из них, по крайней мере, для меня знакомым). Найдите место в списке, где ваш желудок перестает бросаться, и вы нашли свое решение...

  • Хотя Core Data - очень мощная структура для управления графом объектов компонента модели архитектуры MVC, вы не обязаны его использовать. Вы можете написать свой собственный слой модели и по-прежнему играть в мире Cocoa MVC. Так мы это делали до Core Data. Вы все равно можете использовать Cocoa NSObjectController, NSArrayController и NSTreeController, если хотите. Таким образом, вы можете свернуть свой собственный уровень доступа к данным, используя собственные API C/С++ вашего поставщика базы данных.

  • BaseTen framework - это коммерческий лицензированный Core Data-API, расположенный поверх бэкэнда PostgreSQL. Это скорее больше ORM, чем структура управления графическим объектом, например Core Data, но API аналогичен. Я понимаю, что он может обрабатывать существующую (произвольную) схему или использовать модели объектов, управляемых Core Data. Они предоставляют свой собственный подкласс NSArrayController, который можно использовать для замены контроллера массива Cocoa. Я никогда не использовал BaseTen лично, поэтому я не могу говорить о его полезности, но я слышал хорошие вещи. Насколько я знаю только PostgreSQL.

  • Мост Python- Objective-C, называемый PyObjC, довольно зрелый и поставляется с OS X с 10.5. Используя этот мост, вы можете написать полные Cocoa приложения на Python или написать гибридное приложение Python/Objective-C. Используя PyObjC, вы можете использовать любой из ORM Python, например SQLAlchemy, чтобы реализовать свой уровень модели. Опять же, нет работы, но, возможно, относительно легко для компетентного программиста Python и Cocoa.

  • Apple Enterprise Object Framework, входящая в состав WebObjects, теперь является Java ORM, которая имеет Objective-C ORM в своей линейке. Вы можете, я полагаю, по-прежнему писать настольные приложения с помощью WebObjects. Я понимаю, что многие шаблоны Cocoa переносятся, но это совсем другой зверь. Я никогда не писал код WebObjects, поэтому я не могу дать вам больше советов по этому поводу.

  • Вы можете использовать кросс-платформенный инструментарий. Qt может создавать достойные Mac интерфейсы (хотя см. ниже). Qt также имеет структуру модельного уровня, которая включает поддержку SQL для нескольких баз данных в QtSql. Qt не является Cocoa вообще. Пользователям Savy Mac не нравятся неродные приложения. Qt примерно так же хорош, как и для кросс-платформенной OS X, но он не идеален. Если вы можете оставаться родным, сделайте это.

  • Любая Java Swing/SWT дерьмо. Опять же, это мощный материал, но на Mac он похож на ад, и пользователям это не нравится.

  • Моно на OS X относительно незрелое, и я не знаю, какой статус любого из .Net ORM находится в Mono. Это что-то, на что посмотреть. Что касается UI, то материал Mono-GTK выглядит довольно плохо на OS X. Существует привязка С# для Qt, называемая Qyoto, которая работает на Mono.

Ответ 4

Не похоже, чтобы кто-то упомянул эти книги:

  • Основные данные от Marcus Zarra, Прагматические программисты
  • Основные данные для iPhone Тима Истеда, Эддисон-Уэсли (который, да, это книга для iPhone, но большинство принципов основных данных разделены между платформами).

Ответ 5

Однако для гаек и болтов вы можете найти Apple Основы основных данных полезный - есть также учебник по созданию GUI- меньше утилита там.

Ответ 6

яблоко продает приборы и знаменитости (голливуд) они не имеют абсолютно никакого отношения к развитию предприятия cocoa был оставлен до того, как был закончен для оппортунистического cocoa касания если вы ищете что-либо на уровне delphi/vcl или .net, удачи вам (у них ничего подобного)

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