Изменить делегата MGTwitterEngine

Я настроил и успешно вошел в систему через xAuth, используя расширенный класс MGTwitterEngine, мой вопрос в том, хочу ли я передать это другому контроллеру представления, как я могу изменить класс делегата, так как это какая-то слабая ссылка

@interface MGTwitterEngine : NSObject <MGTwitterParserDelegate> {
__weak NSObject <MGTwitterEngineDelegate> *_delegate;

Лучше ли мне обернуть это в одноэлементный класс и пройти таким образом, кажется излишним для входа в систему каждый раз, или я пропустил кропотливо очевидный способ совместного использования этого объекта вокруг

На данный момент я добавил метод setDelegate в MGTwitterEngine, но чувствую, что борюсь с фреймворком без необходимости.


person kgutteridge    schedule 02.06.2010    source источник
comment
Я бы тоже хотела узнать ответ на этот вопрос. Мне бы хотелось, чтобы вы могли указывать делегата в каждом запросе.   -  person Camsoft    schedule 29.04.2011


Ответы (3)


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

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

Если у вас есть разные контроллеры представления, вызывающие одни и те же методы (и если да, то почему?), вы все равно можете перенаправлять ответы обратно в соответствующие контроллеры представления. Как говорится в документации MGTwitterEngine, "Каждый метод Twitter API возвращает NSString, который является уникальным идентификатором для этого соединения". Вам просто нужно передать объект (ваш контроллер представления) или блок в качестве дополнительного параметр для каждого из ваших обернутых методов. Вы можете кэшировать строку идентификатора твиттера и этот объект/блок в изменяемом словаре, когда ваша оболочка отправляет ответ, а затем искать идентификатор соединения в кеше, когда пришло время обработать ответ.

person skue    schedule 09.05.2011
comment
Я начал думать в этом направлении. Имеет смысл иметь одного делегата для MGTwitterEngine и заставить его направлять результаты обратно в правильный контроллер представления/представления. Большое спасибо! - person Camsoft; 10.05.2011
comment
Я пришел к такому же выводу, когда работал над небольшим проектом в прошлом году. В итоге я реализовал метод subscribe:(id)target toResultsOf:(NSString)connectionId, который использовал NSMutableDictionary для хранения подписок. Как только делегат получает результаты, он ищет цель, перенаправляет данные в метод с той же сигнатурой в контроллере и удаляет подписку. - person freeatnet; 12.05.2011

на самом деле, вы можете. Делегат — это не что иное, как переменная в MGTwitterEngine. Просто добавьте его экземпляр в следующий контроллер представления, добавив правильный заголовок и вызовы реализации. после установки нового набора контроллеров представления:

nextViewController._mgTwitterEngine = self.mgTwitterEngine;
nextViewController.mgTwitterEngine.delegate=nextViewController;

затем вызовите nextViewController. Не забудьте вернуть делегата к исходному контроллеру представления, когда вы вернетесь к нему (либо на viewDidAppear, либо на viewWillAppear).

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

person Marsson    schedule 05.05.2011
comment
Просто интересно, как это будет работать, если приложение сделает несколько асинхронных запросов Twitter одновременно от разных контроллеров, используя один и тот же объект движка Twitter. По сути, я вижу, что все запросы возвращаются последнему зарегистрированному делегату. Должен действительно быть отправлен с запросом? - person Camsoft; 06.05.2011
comment
Ответ вернется к последнему зарегистрированному делегату... либо вы должны обрабатывать это в каждом классе, который будет использовать mgTwitterEngine, либо вы можете использовать метод singleton, или даже попытаться использовать singleton, который обрабатывает только ответы через центр уведомлений... - person Marsson; 10.05.2011

Используйте NSNotifications в делегате.

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

person Nate Symer    schedule 20.07.2012