0

我可以关注 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 方法需要 a 的事实uint8_t,但这就是为什么存在按位的东西吗?将 NSInteger 变成 unint8_t?

该代码不适用于我上面的更改。它将很好地记录并且视觉上客户端将正常运行,但是消息没有从客户端正确地发送/接收到客户端。

有人可以用简短的话解释一下按位的东西在做什么吗?还是我是正确的?

谢谢!这是我对 SO 的第一个问题,所以请善待。


感谢您的回复。我还是有点疑惑。得到它?

基本上,为什么?

这只是传递标识符的一种极客方式吗?这些视图中的每一个都有一个标签#,为什么不直接传递它,并从视图类切换状态(上/下)?

这只是“这就是编写它的人是如何做到的”的一个例子,还是我错过了一个关键的难题,因为这也是我应该如何构建我的代码的方式。

我只想传递一个标签#,然后让该标签决定在一个清晰可读的函数中做什么,比如toggleUpOrDownState什么。

我猜,这种按位计算的东西总是让我觉得自己很愚蠢,除非有必要等等。然后我觉得自己很愚蠢,但无论如何还是设法蒙混过关。:)

4

3 回答 3

3

基本上,[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];

所以,流的接收者正在检查那个高位。

于 2008-11-22T16:29:03.193 回答
0

我相信原因是高位是从一个对等方传递到另一个对等方的另一段数据。它指定消息是针对敲击的“开始”还是敲击的“结束”。

基于该位,接收器要么激活点击视图,要么停用它。

因此,从本质上讲,他们将两条信息放入该单个无符号整数中 - 哪个正方形被轻敲(低位),以及触摸是开始还是结束(高位)。

于 2008-12-02T05:28:11.997 回答
0

我认为消息可能会被丢弃,或者以不同的顺序到达。因此,如果您不说是轻按还是轻按,则切换可能会被取消。

于 2008-12-19T06:36:03.037 回答