можно ли передать массив как obj через nsnotification

Я мог бы сделать это, используя протокол и делегат, но я хотел бы попробовать с NSNotification

Моя задача отправляет NSMutableArray через уведомление из одного представления в другое. Можно ли сделать

[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData" object:myArray];

Затем в приемнике, как я могу получить переданный myArray. Я читал и запутался в userInfo и object объекта уведомления.

Пожалуйста, посоветуйте мне по этому вопросу.


person tranvutuan    schedule 24.07.2012    source источник
comment
да, я пытался, но когда я перехватываю переданный массив.. Должен ли я использовать [notification object] и перехватывать его в NSMutableArray. как насчет userInfo. когда я должен использовать userInfo.   -  person tranvutuan    schedule 24.07.2012


Ответы (4)


NSNotification имеет свойство userInfo, которое является NSDictionary. object — это NSObject, который публикует NSNotification. Поэтому обычно я использую self для object, когда настраиваю NSNotification, потому что self — это NSObject, отправляющий NSNotification. Если вы хотите пройти NSArray, используя NSNotification, я бы сделал следующее:

NSArray *myArray = ....;
NSDictionary *theInfo =
  [NSDictionary dictionaryWithObjectsAndKeys:myArray,@"myArray", nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData"
                                                    object:self
                                                  userInfo:theInfo];

А затем поймать его, используя следующее:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(doTheReload:)
                                             name:@"reloadData"
                                           object:sendingObject];

где sendingObject — это объект, который отправляет NSNotification.

Наконец, декодируйте массив в doTheReload:, используя:

NSArray  *theArray = [[notification userInfo] objectForKey:@"myArray"];

Это всегда работает для меня. Удачи!

person Justin Paulson    schedule 24.07.2012
comment
очень быстрый вопрос: когда вы говорили where sendingObject is the object that is sending the NSNotification, и что было сделано, так это создать NSDictionary *sentOject = [NSDictionary alloc] init]; and pass it to [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doTheReload:) name:@reloadData sentObject]`, и я вообще не получаю уведомления.. .. Я пропустил что-то в середине - person tranvutuan; 24.07.2012
comment
нет, sendingObject — это объект, опубликовавший NSNotification. Так что, если это было опубликовано, например, вашим AppDelegate, вам нужно будет указать свой AppDelegate в поле object:. Если бы оно было отправлено каким-то viewController, вам нужно было бы указать ЭТО ТОЧНОЕ viewController в поле object:. Это должно быть id объекта, отправившего NSNotification - person Justin Paulson; 24.07.2012
comment
только что изменил, и то, что я сделал, is[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doTheReload:) name:@"reloadData" object:[A class]] ; Я поставил [A class], потому что A - это объект, который опубликовал NSNotification. но все еще не работает... Я думаю создать объект класса A, выполнив A *a = [[A alloc] init], но я сомневаюсь в этом... - person tranvutuan; 24.07.2012
comment
Нет, вам нужно отправить его с self. Вы не передаете CLASS объекта, который его отправляет, вы передаете фактический id объекта, который его отправляет, а затем вам нужно поймать фактический id объекта, из которого он отправлен. Если вы не знаете, как получить эту информацию, это может сработать с помощью nil, но я бы не рекомендовал это делать. - person Justin Paulson; 24.07.2012
comment
@JustinPaulson, если мой контроллер, который запускает уведомление, следует другому «пути раскадровки» и не связан напрямую с тем, что улавливает уведомление, лучший способ передать информацию через appdelelgate? - person ThinkBonobo; 08.01.2014
comment
@ThinkBonobo, это действительно зависит от того, как вы хотите это сделать. Если вы можете успешно перехватить уведомление, вы можете также использовать его для передачи userInfo. - person Justin Paulson; 09.01.2014
comment
Действительно, действительно, спасибо @Justin Paulson :) и sendObject я передаю ноль. и это работает для меня. - person Mihir Oza; 09.04.2015

Вы должны использовать userInfo. Это для разных данных, которые вы хотите отправить с уведомлением. Аргумент object предназначен для объекта, для которого запускается событие. Например, если вы хотите отслеживать определенный MPMoviePlayerController (но не другие), вы должны подписаться только на его уведомления (через аргумент object).

person borrrden    schedule 24.07.2012
comment
если он публикует уведомление для себя, он может использовать как object, так и userInfo. просто ему нужно знать, что он использует для чего. :) - person holex; 24.07.2012
comment
userInfo это NSDictionary. Однако я пропускаю NSMutableArray. Как вы сказали, я должен создать NSDictionary для хранения моего массива. - person tranvutuan; 24.07.2012
comment
Я понятия не имею, почему за это проголосовали. Это точно правильный ответ. Вы храните NSArray внутри словаря userInfo. Как говорит @borrrden, object всегда должен быть объектом, который публикует уведомление. Массив не публикует уведомление, поэтому он не должен быть object. Несоблюдение этого соглашения последовательно является источником действительно неприятных ошибок (обычно с симптомом причудливого не отвечает на сбои селектора). - person Rob Napier; 24.07.2012
comment
@ttran Да, это словарь, в котором вы можете удобно хранить несколько фрагментов информации. Добавьте свой массив в словарь (и все, что вы хотите) - person borrrden; 24.07.2012
comment
@borrrden: я решаю, должен я или не должен создавать dictionary для хранения моего object, такого как myArray. Теперь я знаю, что делать. Благодарность - person tranvutuan; 24.07.2012

это очень последовательно, потому что object — это object, а userInfo — это userInfo, когда вы публикуете любое уведомление, используя метод -postNotificationName:object:userInfo:.

да, вы можете опубликовать любой подкласс NSObject через NSNotificationCenter.

person holex    schedule 24.07.2012

Свифт 4, Свифт 5

NotificationCenter.default.post(name: Notification.Name("favoriteIsDeleted"), object: [message, self.viewModel.deleteSuccessIcon])

@objc func favoriteIsDeleted(notification: Notification) {
    guard let object = notification.object as? [String?], let message = object[0], let deleteSuccessIcon = object[1] else { return }
    // Code here ...
}
person Pengguna    schedule 01.09.2020