Подтвердить что ты не робот

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

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

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

@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, как это

classA{

**classB** <classADelegate> delegate;


[self.delegate DelegateMethod];

}

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

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

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

вот так.

classB{

-(void)DelegateMethod;

}

а затем вызовите это в

classA{

       classB delegate;

       -(void)viewdidload{

            [self.delegate DelegateMethod];

        }

    }

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

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

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

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

что такое использование @protocol.

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

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

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

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

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

ThankU

4b9b3361

Ответ 1

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

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

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

NSNotificationCenter - это своего рода "хак-иш" и часто используется новичками-программистами, которые могут привести к плохой архитектуре. Много раз эти две функции взаимозаменяемы, но более "хардкорные" разработчики могут издеваться над использованием NSNotificationCenter.


Q:, в чем причина использования "id" и в чем их отличие?

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


classB{

-(void)DelegateMethod;

}

а затем вызовите это в

classA{

   classB delegate;

   -(void)viewdidload{

        [self.delegate DelegateMethod];

    }

}

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

Ответ 2

Делегат использует протоколы и создает связь 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 the delegate method we implement
- (NSString*) determineValue
{
    return @"I did some work!";
}

@end

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

Делегаты:

Один к одному

Извещение:

Односторонние

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

@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:, когда вы закончите.