Передача наборов данных
-
09-06-2019 - |
Вопрос
Вопрос, который мучил меня в последнее время.Я в первую очередь .net-разработчик, который увлекается Objective-C для iPhone и Mac.
Как вы отправляете "наборы данных" между методами в objective-c.Например, в C # вы можете заполнить пользовательский класс данными и передавать их по кругу в виде списка типа custom class.НАПРИМЕР, если бы у вас был класс customer, вы бы просто сделали что-то вроде:
List<Customer> customers = DataLayer.GetAllCustomers();
Единственный способ, которым я могу понять, как это можно было бы сделать в obj-c, - это заполнить NSArray пользовательскими объектами?Является ли это эффективным способом что-то делать?Есть еще какие-нибудь рекомендации?Я использую sqlite в качестве базы данных / data, которые я хочу вернуть.
Решение
Вы на правильном пути.
Классы коллекции Cocoa, все из которых имеют изменяемые и неизменяемые варианты, следующие:
- NSArray ( скопление ):упорядоченный, может содержать объект несколько раз
- Справочник:неупорядоченный, сопоставляющий ключи значениям, ключи копируются
- NSSet:неупорядоченный, может содержать объект только один раз
- NSCountedSet - набор данных:неупорядоченный, может содержать объект несколько раз
Неизменяемые варианты очень помогают повысить эффективность.Стандартным шаблоном для средств доступа классов, имеющих изменяемые варианты, является копирование, а не сохранение.Это кодифицировано в @property
механизм, посредством использования copy
атрибут в свойстве:
// Department.h
@interface Department : NSObject
@property (readwrite, copy) NSSet *employees;
@end
Это означает, что если вы передадите изменяемый массив чему-то, что принимает массив, оно будет скопировано, а если вы передадите это чему-то другому, оно будет скопировано снова.Хитрость, однако, в том, что "копирование" неизменяемого объекта на самом деле просто сохраняет его, так что вы получаете удар только для этой первой копии.Вы , вероятно, хотеть в любом случае, сделать копию в тот первый раз, чтобы вы не передавали изменяемый массив чему-то другому, а затем мутировать его за спиной того, кому вы его передали.
Что касается Cocoa на Mac OS X, я бы также настоятельно рекомендовал вам ознакомиться с Core Data.Это альтернатива шаблону "набор данных", к которому вы, возможно, привыкли из .NET / ADO / etc.С Core Data вы не можете "собрать всех клиентов", а затем распространить эту коллекцию по всему миру.Вместо этого вы запрашиваете клиентов, которые вам небезразличны, и по мере того, как вы просматриваете связи объектов, к которым вы обратились с запросом, другие объекты будут автоматически подключены к вам.
Core Data также предоставляет вам такие функции, как визуальное моделирование ваших объектов, автоматическая генерация средств получения и установки свойств, детальный контроль над миграцией с одной версии схемы на другую и так далее.