it-swarm.com.ru

в чем разница между делегатом и уведомлением?

в чем разница между делегатом и уведомлением?

я понял, как делегат и протокол,

@protocol classADelegate

-(void)DelegateMethod;


@end



classB <classADelegate>{

   classA *ObjOfclassA=[[classA alloc]init];

    ObjOfclassA.delegate=self;

//while Push later, here we have taken the pointer of classB(self) to classA and stored in delegate variable of classA. so from classA we can call the function in classB

   Push:classA from here.


   -(void)DelegateMethod{

        nslog(@"i am rithik from India");


     }

}


classA{

   id <classADelegate> delegate;

   -(void)viewdidload{

        [self.delegate DelegateMethod];

    }

}

Мое сомнение 

1 почему мы не используем в классе А, как это

classA{

**classB** <classADelegate> delegate;


[self.delegate DelegateMethod];

}

в чем причина использования " id " и чем они отличаются?

2 мы вызвали метод функции DelegateMethod класса B, который получен из определения протокола.

вместо этого мы можем напрямую вызвать этот метод, определив этот метод экземпляра classB.потому что мы получили указатель на classB в переменной делегата classA.

как это. 

classB{

-(void)DelegateMethod;

}

а затем позвонить в 

classA{

       classB delegate;

       -(void)viewdidload{

            [self.delegate DelegateMethod];

        }

    }

итак, из вышесказанного мы избежали протокола и переменной id .

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

вот какова реализация протокола для метода функции DelegateMethod.

вместо определения экземпляра.

как их использовать @protocol.

пожалуйста, направьте меня в правильном направлении ...

я новичок в разработке iphone.

прямо сейчас я знал, как создать делегата. Но пока я пришел изучать NSNotification

это также делает почти правильную работу, как делегат.

поэтому, когда я должен использовать Delgate или NSnotification.

Спасибо

19
rithik

Краткий ответ: Вы можете думать о делегатах, как телефонный звонок. Вы звоните своему приятелю и особенно хотите поговорить с ним. Вы можете что-то сказать, и они могут ответить. Вы можете говорить, пока не повесите трубку. Делегаты почти таким же образом создают связь между двумя объектами, и вам не нужно знать, каким будет тип делегата, он просто должен реализовать протокол. С другой стороны, NSNotifications подобны радиостанции. Они передают свое сообщение тому, кто хочет слушать. Радиостанция не может получать отзывы от своих слушателей (если у нее нет телефона или делегата). Слушатели могут игнорировать сообщение или что-то сделать с ним. NSNotifications позволяют вам отправлять сообщения любым объектам, но у вас не будет связи между ними для связи туда и обратно. Если вам нужно это сообщение, вы, вероятно, должны реализовать делегата. В противном случае NSNotifications проще и проще в использовании, но могут привести к неприятностям.

Длинный ответ:

Делегаты, как правило, являются более подходящим способом решения проблем, особенно если вы создаете среду, которую могут использовать другие. Вы получаете проверку времени компиляции для требуемых методов, когда используете протоколы со своими делегатами, поэтому вы знаете, когда компилируете, если вы пропустили какие-либо обязательные методы. С NSNotificationCenter у вас нет такой гарантии.

NSNotificationCenter является своего рода "взломанным" и часто используется начинающими программистами, что может привести к плохой архитектуре. Часто эти две функции взаимозаменяемы, но более «хардкорные» разработчики могут смеяться над использованием NSNotificationCenter.


В: в чем причина использования «id» и чем они отличаются?

A: Использование id позволяет отправлять любой объект методу в качестве параметра. Обратите внимание, что вы не можете отправлять примитивы, такие как bools, float, double, int и т.д., Если они не обернуты в соответствующие обертки объектов.


classB{

-(void)DelegateMethod;

}

а затем позвонить в

classA{

   classB delegate;

   -(void)viewdidload{

        [self.delegate DelegateMethod];

    }

}

В приведенном выше примере требуется, чтобы делегат classA всегда имел тип classB, что не является преимуществом. Вместо использования делегатов в этом сценарии вы, вероятно, просто используете переменную, которая ссылается на ваш другой класс, скажем, myClassB. Прелесть делегатов в том, что вы можете обойти любой объект, и код работает, если они реализуют требуемые методы (что обеспечивает компилятор, если он помечен как правильный тип делегата).

105
FreeAsInBeer

Делегат использует протоколы и создает отношения has-a между двумя классами. Еще одно преимущество делегатов заключается в том, что вы можете возвращать что-то обратно классу-владельцу.

Уведомления, с другой стороны, больше ориентированы на многоточечную связь. Пример использования NSNotification может быть в приложении контроллера панели вкладок, где вам может потребоваться уведомить несколько контроллеров представления о конкретном событии, чтобы они могли обновить данные и т.д. Это отлично подходит для классов, которые не знают друг друга, и это не имело бы смысла, если бы они сделали.

Теперь к другим вашим вопросам:

Почему мы используем id?
В вашем классе вам нужен дескриптор неопределенного типа , но который реализует определенный вами протокол. Возьмите UIWebView, например. Для него могут быть бесконечно малые типы классов, которые могут быть его делегатом, поэтому он не должен называть конкретный тип класса, а должен указывать, что класс должен реализовывать протокол UIWebViewDelegate. Это уменьшает связь до абсолютного минимума и создает очень связное приложение, в котором вы создаете взаимодействие, основанное на поведении , а не на состоянии.

Итак, давайте рассмотрим пример:

@protocol ClassADelegate
- (NSString*) determineValue;
@end

@interface ClassA : NSObject
{
    id<ClassADelegate> delegate;
}
//  Make sure you are using assign, not retain or copy
@property (nonatomic, assign) id<ClassADelegate> delegate;

@end

Реализация ClassA:

import "ClassA.h"

@implementation ClassA
@synthesize delegate;

- (void) somePrivateMethod
{
    if (self.delegate && [self.delegate implementsProtocol:@protocol(ClassADelegate)])
    {
        NSString* value = [self.delegate determineValue];

        // Do other work
    }
}

- (void) dealloc
{
    delegate = nil;
}

@end

В заголовке мы объявляем, что класс будет реализовывать протокол ClassADelegate:

#import "ClassA.h"

@interface ClassB : NSObject <ClassADelegate>
{
}

- (void) someMethod;

@end

В реализации ClassB мы создаем экземпляр ClassA и устанавливаем B в качестве делегата A:

#import "ClassB.h"
@implementation ClassB

- (void) someMethod
{
    ClassA* aClass = [[ClassA alloc] init];

    aClass.delegate = self;

   // Other work and memory clean up of A.
   // Some logic occurs in A where it calls the delegate (self) which will 
   // call the `determineValue` method of this class.
}

//  Here's the delegate method we implement
- (NSString*) determineValue
{
    return @"I did some work!";
}

@end
13
Wayne Hartman

Делегат передает сообщение от одного объекта другому. Это как общение один на один, тогда как nsnotification - это как передача сообщения нескольким объектам одновременно. Все другие объекты, которые подписались на это уведомление или действующие наблюдатели на это уведомление, могут или не могут ответить на это событие. Уведомления проще, но вы можете столкнуться с проблемами, используя плохую архитектуру. Делегаты используются чаще и используются с помощью протоколов.

3
Aman Pathak

Мы можем использовать уведомления по разным причинам. Например , вы можете передать уведомление, чтобы изменить способ отображения элементов пользовательского интерфейса на основе определенного события в другом месте программы. Или вы можете использовать уведомления как способ гарантировать, что объекты в документе сохраняют свое состояние до закрытия окна документа. 

Общая цель уведомлений - информировать другие объекты о событиях программы, чтобы они могли реагировать соответствующим образом. Но объекты, получающие уведомления, могут реагировать только после того, как событие произошло. Это существенное отличие от делегирования. 

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

0
Jayprakash Dubey

Просто мы можем сказать,

Участники конференции:

Один к одному

Уведомление:

Один ко многим

Объявить делегата

@protocol DelegateName
@required
- (void)method:(NSString *)param;
@optional
- (void)methodOptional:(NSString *)param;
@end

И объявить свойство для протокола

@property id <DelegateName> delegate;

Ты можешь использовать

myObject.delegate = <# some object conforming to DelegateName #>;

NSNotification декларация

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(notificationHappened:)
                                             name:MyCustomNotificationName
                                           object:nil];

Затем реализовать

- (void)notificationHappened:(NSNotification *)notification {
    // do work here
}

Вы можете публиковать уведомления из любого места, используя,

[[NSNotificationCenter defaultCenter] postNotificationName:MyCustomNotificationName
                                                    object:self
                                                  userInfo:nil];

позвоните removeObserver:, когда вы закончите.

0
Lal Krishna