2015-08-22 6 views

ответ

2

Поскольку у нас достаточно информации о концепциях пересылки сообщений и сообщений, давайте обсудим это решение. В проекте, над которым я сейчас работаю, есть функция поиска. Пользователь может выполнять поиск по некоторым критериям. Этот критерий состоит из первичных и продвинутых критериев, а классы данных данных для обоих. Первичный datamodel будет содержать вторичный datamodel как свойство. Существует структура, которая заботится о сопоставлении таблиц базы данных с указанными datamodels. Чтобы сохранить или получить данные, инфраструктура будет отправлять сообщение в сопоставленный класс данных. Эта структура не поддерживает вложенные сопоставления. Основной класс datamodel сопоставляется с таблицей базы данных, поэтому инфраструктура ожидает, что столбцы будут сопоставлены с свойствами, и будет отправлять сообщения об установщике и получателе в основной класс данных. Решение состоит в том, чтобы сделать расширенную модель данных суррогатом первичной модели данных. В первичном классе datamodel путем переопределения следующих методов вторичная датамодель настраивается как суррогат для основного класса данных.

- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector 
{ 
    NSMethodSignature* signature = [super methodSignatureForSelector:selector]; 
    if (!signature) { 
     signature = [surrogate instanceMethodSignatureForSelector:selector]; 
    } 
    return signature; 
} 

- (void)forwardInvocation:(NSInvocation *)anInvocation 
{ 
    if ([surrogate respondsToSelector:[anInvocation selector]]) 
     [anInvocation invokeWithTarget:surrogate]; 
    else 
     [super forwardInvocation:anInvocation]; 
} 

Если бы я использовал первоначальный подход ручного добавления сеттеров и добытчиков, я бы в конечном итоге писать так много методов, как удвоенное число свойств и должен был убедиться, что весь метод сигнатур подражают передовые критерии свойства , Любые изменения в имени свойств являются хорошей точкой входа для регрессии, и обслуживание кода будет беспорядочным. Другой подход заключается в том, чтобы поддерживать единую базу данных, которая будет представлять все критерии, которые будут создавать другие проблемы, поскольку требования к iPhone и iPad разные. Подход для пересылки сообщений уменьшил количество требуемых ручных усилий и будет масштабироваться, даже если есть изменения в датамоделях.

Refrence: http://blog.imaginea.com/message-forwarding-and-surrogate-objects-in-objective-c/

1

Хотя instanceMethodSignatureForSelector это функция, которую вы хотите вызвать, чтобы получить подписи методов любого класса, в methodSignatureForSelector является то, что вы бы в первую очередь overrride обеспечить альтернативные методы выполнения, если он смотрит вверх метод протокол.

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