XMPPFramework: попытка обновить псевдоним на VCard

Этот вопрос так же прост, как и следует из его названия: я пытаюсь обновить никнейм пользователя на его VCard, но не могу. Я использую этот код:

dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_PRIORITY_DEFAULT);
    dispatch_async(queue, ^{
        XMPPvCardTemp *myVcardTemp = [[[self appDelegate] xmppvCardTempModule] myvCardTemp];
        [myVcardTemp setNickname:@"a_nickname"];
        [[[self appDelegate] xmppvCardTempModule] updateMyvCardTemp:myVcardTemp];
    });

Я не могу представить, почему этот фрагмент кода не хочет работать, в то время как тот же фрагмент, но с обновлением фотографии, работает как шарм:

NSData *imageData = UIImagePNGRepresentation(anImage);
        dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_PRIORITY_DEFAULT);
        dispatch_async(queue, ^{
            XMPPvCardTemp *myVcardTemp = [[[self appDelegate] xmppvCardTempModule] myvCardTemp];
            [myVcardTemp setPhoto:imageData];
            [[[self appDelegate] xmppvCardTempModule] updateMyvCardTemp:myVcardTemp];
        });

Буду признателен за любую помощь... это сводит меня с ума

ПРИМЕЧАНИЯ: я использую OpenFire в качестве сервера XMPP.

И это строфа, которую мне возвращает сервер, когда я пытаюсь обновить никнейм

RECV: <iq xmlns="jabber:client" type="result" from="[email protected]" to="[email protected]/2cfc4f88"><chat_jorges xmlns="vcard-temp"><NICKNAME>chat_jorges</NICKNAME></chat_jorges></iq>

(Я изменил ip своего сервера на 000.000.000.000)


person Jorge Ramos    schedule 13.05.2013    source источник
comment
может быть, это глупо, но вы пробовали: setNICKNAME = @ваш никнейм ?   -  person Franck    schedule 13.05.2013
comment
ну, XMPPvCardTemp не реализовал setNICKNAME, а setNickname, как показано... но спасибо :)   -  person Jorge Ramos    schedule 13.05.2013
comment
Прости. Но чем больше я читаю вашу проблему, тем больше она сводит меня с ума. А если вы нажмете его как данные, а?? (интересно, как это могло быть, но...)   -  person Franck    schedule 13.05.2013
comment
Хорошее замечание, Фрэнк, очень хорошее замечание... дай-ка я попробую...   -  person Jorge Ramos    schedule 13.05.2013
comment
Ну, для метода setNickname требуется параметр NSString, а не NSData... :(   -  person Jorge Ramos    schedule 13.05.2013


Ответы (1)


РЕДАКТИРОВАТЬ: Я СОВЕРШЕННО ОШИБАЛСЯ, НЕ ЧИТАЙТЕ ЭТО

На самом деле, когда я читаю исходный код XMPP, мне интересно, как он может установить значение. В XMPPvCardTempBase.h:

#define XMPP_VCARD_SET_STRING_CHILD(Value, Name) NSXMLElement *elem = [self elementForName:(Name)];
//it looks like a get and not a set??

И в XMPPvCardTemp.m:

- (void)setNickname:(NSString *)nick {
    XMPP_VCARD_SET_STRING_CHILD(nick, @"NICKNAME");
}

Может быть, где-то есть что-то вроде KVC... Можете попробовать это в исходном коде:

 - (void)setNickname:(NSString *)nick {
       XMPP_VCARD_SET_STRING_CHILD(nick, @"NICKNAME") = nick ;
   }
person Franck    schedule 13.05.2013
comment
Хорошо, сейчас попробую. Спасибо за уделенное время. Оставлю отзыв :) - person Jorge Ramos; 13.05.2013
comment
На самом деле, если я использую предложенную вами настройку, XCode выдает ожидаемое выражение ошибки. Как видите, определение XMPP_VCARD_SET_STRING_CHILD уже установило ник как значение... - person Jorge Ramos; 13.05.2013
comment
Ах да, вы правы, я не видел полной реализации определения. - person Franck; 13.05.2013
comment
Кажется, что если я отправлю присутствие сразу после обновления никнейма, метод делегата didReceivePresence будет запущен на других устройствах, и тогда я могу запустить этот код: [xmppRoster setNickname:@name forUser:[присутствие от]]; Кажется, сейчас это работает как патч... Но будет интересно узнать происхождение такого поведения. - person Jorge Ramos; 13.05.2013