Как вызвать методы класса для пользовательского свойства делегата?

У меня есть класс «MyCLController» со свойством «dataSource», которое является делегатом источника данных для класса «MyCLController». Класс «MyCLController» обрабатывает события местоположения и т. Д., И этому классу требуется несколько методов для запроса и обновления нескольких таблиц базы данных sqlite. По этой причине я создал протокол «MyCLControlerDataSourceDelegate», который объявляет, какие методы класса делегата источника данных должны реализовывать:

@protocol MyCLControlerDataSourceDelegate <NSObject>

@required

+ (NSArray *)getAllRegions;
+ (void)saveVisitTimeForRegionID:(NSInteger);
-(void)someInstanceMethod;

@end

А вот объявление свойства делегата источника данных:

@property (nonatomic, assign) id <MyCLControlerDataSourceDelegate> dataSource;

После выделения/инициации моего «MyCLController» я связываю его свойство dataSource с объектом класса типа, который реализует протокол MyCLControlerDataSourceDelegate.

Я хотел бы спроектировать «MyCLController» как слабосвязанный, чтобы ему не нужно было знать, какой тип свойства класса «dataSource». Все хорошо, при вызове методов экземпляра, например:

[self.dataSource someInstanceMethod];

А как насчет вызова методов класса? Я знаю, что методы класса должны называться [ClassName classMethod], но это сделало бы «MyCLController» менее независимым.


person Centurion    schedule 15.11.2011    source источник
comment
Почему они являются методами класса? Если у вас есть экземпляр, который вы должны сделать для делегата, то кажется, что все методы делегата должны быть методами экземпляра.   -  person jrturton    schedule 15.11.2011
comment
Потому что я работаю над проектом, где я должен реализовать только свою задачу, а не нарушать рабочие соглашения проекта. Все классы БД и их методы запросов являются методами класса, и эти классы не являются синглтонами (за исключением того, что они используют синглтон БД), они просто запрашивают БД. И на самом деле мне не нужно выделять/инициировать какой-либо из этих классов. Я смотрю на эту потребность с точки зрения пользователя, а не с точки зрения target-c и их ограничений. Просто интересно можно ли по другому.   -  person Centurion    schedule 15.11.2011
comment
Как кодер, я также могу быть идентифицирован как пользователь, который использует Objective-C и iOS, и, глядя с этой точки зрения, я чувствую, что это было бы удобно для меня. Но если это невозможно, я сдаюсь :)   -  person Centurion    schedule 15.11.2011


Ответы (1)


Одним из решений может быть вызов метода «класс» для объекта. Он получит имя класса объекта, а затем мы можем вызвать его метод класса, например:

NSArray *allRegions = [[self.dataSource class] getAllRegions];
person Centurion    schedule 15.11.2011