2008-11-22 5 views
0

je peux suivre la plupart de l'échantillon de WiTap d'Apple, mais je suis en quelque sorte perplexe sur ce bit dans la méthode d'envoi:Bonjour réseau Aide sur iPhone échantillon 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]]; 

} 

Notez que j'ai changé l'envoi: l'argument juste l'étiquette des vues, numérotées de 1 à 9. À l'origine, le code comportait les ajustements au niveau des bits AND et OR.

POURQUOI?

Je reçois le fait que la méthode d'envoi a besoin d'un uint8_t, mais est-ce la raison pour laquelle le bitwise est là? Pour transformer un NSInteger en unint8_t?

Le code ne fonctionne pas avec mes modifications ci-dessus. Il se connectera correctement et visuellement le client fonctionnera correctement, mais les messages ne sont pas envoyés/reçus correctement du client au client. Est-ce que quelqu'un peut expliquer en petits mots ce que fait le bitwise? Ou ai-je raison?

Merci! C'est ma première question à SO donc s'il vous plaît soyez gentil.


merci pour la réponse. Je suis encore un peu perplexe. Trouver?

Fondamentalement, pourquoi?

Est-ce juste un moyen geek de transmettre un identifiant? Chacune de ces vues a un tag #, pourquoi ne pas simplement passer cela, et basculer l'état (haut/bas) de la classe de vue?

Est-ce juste un cas de "c'est comme ça que la personne qui l'a écrit l'a fait", ou est-ce que je manque une pièce cruciale du puzzle en ce sens que je devrais aussi structurer mon code. Je voudrais juste passer un tag # et ensuite avoir cette étiquette décider quoi faire dans une fonction clairement lisible comme toggleUpOrDownState ou quelque chose. Ce truc au niveau des bits me rend toujours stupide je suppose, à moins que ce soit nécessaire, etc. Ensuite, je me sens stupide, mais parvient à embrouiller de toute façon de toute façon. :)

Répondre

3

Fondamentalement, [view tag] | 0x80 définit le bit haut dans cette valeur (donc 00010011 deviendrait 10010011) et [view tag] & 0x7f le supprime (10010011 -> 00010011).

Jetez un oeil à la méthode [AppController stream:handleEvent:]. Vous verrez ce code:

 //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]; 

Ainsi, le récepteur du flux vérifie ce bit haut.

0

Je crois que la raison pour laquelle est que le bit de poids fort est une autre partie des données transmises d'un pair à l'autre. Il spécifie si le message est pour le "début" du tap ou la "fin" du tap.

Sur la base de ce bit, le récepteur active la vue de prise ou la désactive. Donc, en substance, ils placent deux informations dans ce seul entier non signé - quel carré est tapé (les bits faibles), et les touches commencent ou se terminent (le bit haut).

0

Je pense qu'il est possible que des messages soient déposés ou arrivent dans un ordre différent. Donc, si vous ne dites pas si c'est un robinet ou un robinet, il est possible que le basculement soit ébranlé.