Bonjour Networking Help на образце iPhone WiTap - PullRequest
0 голосов
/ 22 ноября 2008

Я могу следовать большей части примера Apple WiTap, но я немного озадачен этим битом в методе отправки:

- (void) send:(const uint8_t)message
{
if (_outStream && [_outStream hasSpaceAvailable])
    if([_outStream write:(const uint8_t *)&message maxLength:sizeof(const uint8_t)] == -1)
        [self _showAlert:@"Failed sending data to peer"];
 }

 - (void) activateView:(TapView*)view
{
    NSLog(@"ACTIVATE TAG: %d", [view tag]); 
    //[self send:[view tag] | 0x80];
    [self send:[view tag]];
 }

 - (void) deactivateView:(TapView*)view
 {
    NSLog(@"DEACTIVATE TAG: %d", [view tag]); 
    //[self send:[view tag] & 0x7f];
    [self send:[view tag]];

 }

Обратите внимание, что я изменил аргумент send: только на тег представлений, которые пронумерованы от 1 до 9. Первоначально код имел побитовые настройки И и ИЛИ.

Почему?

Я получаю тот факт, что для метода send требуется uint8_t, но есть ли для этого побитовая составляющая? Чтобы превратить NSInteger в unint8_t?

Код не работает с моими изменениями выше. Он будет хорошо регистрироваться, и визуально клиент будет работать правильно, но сообщения не отправляются / принимаются правильно от клиента к клиенту.

Может ли кто-нибудь объяснить маленькими словами, что делает побитовый материал? Или я прав?

Спасибо! Это мой первый вопрос к ТАК, поэтому, пожалуйста, будьте добры.


спасибо за ответ. Я все еще немного озадачен. Получите это?

В основном, почему?

Это просто отвратительный способ передачи идентификатора? Каждое из этих представлений имеет тег #, почему бы просто не передать его и не переключать состояние (вверх / вниз) из класса представления?

Это просто случай "это то, как это сделал тот, кто написал это", или я упускаю важную часть головоломки, потому что именно так я и должен структурировать свой код.

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

Этот битовый материал всегда заставляет меня чувствовать себя глупо, я полагаю, если это не необходимо и т. Д. Тогда я чувствую себя глупо, но все равно каким-то образом могу пробиться сквозь пальцы. :)

Ответы [ 3 ]

3 голосов
/ 22 ноября 2008

По сути, [view tag] | 0x80 устанавливает старший бит в этом значении (поэтому 00010011 станет 10010011), а [view tag] & 0x7f удаляет его (10010011 -> 00010011).

Взгляните на метод [AppController stream:handleEvent:]. Вы увидите этот код:

        //We received a remote tap update, forward it to the appropriate view
    if(b & 0x80)
        [(TapView*)[_window viewWithTag:b & 0x7f] touchDown:YES];
    else
        [(TapView*)[_window viewWithTag:b] touchUp:YES];

Итак, получатель потока проверяет этот старший бит.

0 голосов
/ 19 декабря 2008

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

0 голосов
/ 02 декабря 2008

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

На основе этого бита приемник либо активирует просмотр касания, либо деактивирует его.

Таким образом, по сути, они помещают две части информации в это единственное целое число без знака - какой квадрат был выбран (младшие биты), и были ли штрихи началом или концом (старший бит).

...