Как передать данные ViewControllers/классы с помощью NSNotificationCenter?

У меня есть контроллер табличного представления, который должен быть заполнен данными из массива, инкапсулированного в классе store. Таблица должна знать, сколько строк находится в каждом разделе с помощью метода table:numberOfRowsInSection:. В этом методе мне нужно вернуть размер массива, который находится внутри моего экземпляра store. Сначала я сделал это, сделав store синглтоном, но мне сказали, что это неэффективно и что лучше использовать NSNotificationCenter.

Насколько мне известно, все, что делает NSNotificationCenter, — это запускает методы в определенных объектах, когда другой объект отправляет определенное уведомление. Как я могу использовать NSNotificationCenter для отправки размера массива в мой контроллер табличного представления?


person Byron S    schedule 24.06.2013    source источник
comment
Без информации о том, что это за данные, трудно быть уверенным, но ни NSNotificationCenter, ни синглтон не очень подходят для этого. Почему бы просто не добавить в контроллер табличного представления свойство, указывающее на store? Можно подробнее, что это за данные?   -  person MaxGabriel    schedule 24.06.2013
comment
Не рекомендуется отправлять количество строк через уведомление. Уведомления, как следует из названия, должны использоваться только для уведомлений. В вашем случае его следует использовать для уведомления о том, что в магазине произошли какие-то изменения. Реальные данные (например, количество строк, разделов и т. д.) затем извлекаются из экземпляра хранилища (либо это синглтон, либо экземпляр, на который ссылается контроллер представления).   -  person Khanh Nguyen    schedule 24.06.2013
comment
У меня есть контроллер табличного представления, который нужно заполнить массивом, полным строк. Этот массив является свойством другого класса Store. Должен ли я создать это хранилище при запуске моего контроллера табличного представления и дать контроллеру табличного представления ссылку на него?   -  person Byron S    schedule 24.06.2013
comment
обновление: я пробовал метод предоставления моему контроллеру табличного представления свойства, которое указывает на сохранение при запуске таблицы. кажется, он работает нормально, но рекомендуется ли это использовать синглтон?   -  person Byron S    schedule 24.06.2013


Ответы (3)


Вы можете сделать это следующим образом:

...
// Send 
[[NSNotificationCenter defaultCenter] postNotificationName: SizeOfRrrayNotification
                                                    object: [NSNumber numberWithInteger: [array count]]];

...
// Subscribe
[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(sizeOfArray:)
                                             name: SizeOfRrrayNotification
                                           object: nil];

// Get size
- (void) sizeOfArray: (NSNotification*) notification
{
    NSNumber* sizeOfArray = (NSNumber*) notification.object;
    NSLog(@"size of array=%i",  [sizeOfArray integerValue]);
}
person stosha    schedule 24.06.2013

Опубликовать уведомление :

[[NSNotificationCenter defaultCenter] postNotificationName:@"MyArraySize" object: [NSNumber numberWithInteger: [myArray count]]] userInfo:nil];

Получить уведомление:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getSizeOfArray:) name:@"MyArraySize" object:nil];

Добавьте этот метод в viewController, где вы получаете уведомление:

- (void) getSizeOfArray: (NSNotification*) notification
{
    NSNumber* myArraySize = (NSNumber*) notification.object;
}

вы даже можете отправить больше данных через «userInfo» и получить эти данные в методе селектора, используя уведомление.userInfo, но помните, что его тип — «NSDictionary»

Надеюсь, что это поможет вам.

person Prashant Nikam    schedule 24.06.2013

Метод, в котором вы вычисляете размер массива:

‹------Сторона отправки уведомления---------->

-(void)sizeOfArray{
   int size = [myArray count];
   NSMutableString *myString = [NSMutable string];
   NSString *str = [NSString stringwithFormat:@"%d",size];
   [myString apprndString:str];

//It is to be noted that NSNotification always uses NSobject hence the creation of mystring,instead of just passing size

   [[NSNotificationCenter defaultCenter] postNotificationName:@"GetSizeOfArray"      object:myString];
}

Теперь, когда вы разместили уведомление, добавьте его в метод viewDidLoad контроллера, куда вы отправляете данные.

‹------Принимающая сторона уведомления---------->

-(void)viewDidLoad{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(get_notified:) name:@"GetSizeOfArray"  object:nil];

//The selector method should always have a notification object as its argument

 [super viewDidLoad];

}


- (void)get_notified:(NSNotification *)notif {
    //This method has notification object in its argument

    if([[notif name] isEqualToString:@"GetSizeOfArray"]){
       NSString *temp = [notif object];
       int size = [temp int value];

       //Data is passed.
        [self.tableView reloadData];  //If its necessary 

     }    
}

Надеюсь это поможет.

person Rajarshi    schedule 26.06.2013