Я могу следить за большей частью образца 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 или что-то в этом роде.
Эти побитовые штуки всегда заставляют меня чувствовать себя глупо, если в этом нет необходимости и т. д. Тогда я чувствую себя глупо, но все равно как-то справляюсь. :)





По сути, [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];
Итак, получатель потока проверяет этот старший бит.
Я считаю, что причина в том, что старший бит - это еще одна часть данных, передаваемых от одного партнера к другому. Он определяет, предназначено ли сообщение для «начала» нажатия или «конца» нажатия.
На основе этого бита приемник либо активирует просмотр касанием, либо деактивирует его.
Таким образом, по сути, они помещают две части информации в это единственное целое число без знака - какой квадрат был нажат (младшие биты) и были ли касания началом или концом (старший бит).
Я думаю, что сообщения могут отбрасываться или приходить в другом порядке. Так что, если вы не скажете, нажатие ли это вниз или вверх, возможно, что переключение отключится.