2010-10-01 1 views
0

Не могу понять, почему это происходит, но когда я использую Bluetooth для передачи данных подключенным одноранговым узлам, они получают данные отлично, но затем немедленно отключают невозможность дальнейшего взаимодействия. Может ли кто-нибудь дать какие-либо указания относительно того, почему это может произойти? Я попытался изменить тайм-аут на 60 секунд, я попытался уменьшить количество данных, отправленных на менее 500 байт, и все же я получаю эту странную ситуацию, когда одноранговые узлы будут немедленно отключены друг от друга. Возможно, потому, что я использую GKSession для инициализации сети, а затем GKPeerPicker для людей, чтобы подключиться к ней?Завершение сеанса связи Bluetooth сразу после отправки первых данных

Вот мой код отправки и получения данных. Это в основном временное и, вероятно, изменится для размещения больших объемов данных, но сейчас я просто хочу установить стабильное соединение.

-(void)transmitWholeClusterToPeer:(NSString *)peerID{ 
NSMutableData *data = [NSMutableData data]; 
NSKeyedArchiver *encoder = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data]; 

[encoder encodeInt:0 forKey:@"Mode"]; 
[encoder encodeObject:clusterMap.header forKey:@"Header"]; 
[encoder finishEncoding]; 

NSArray *peerList = [[[NSArray alloc] initWithObjects:peerID, nil] copy]; 

[network sendData:data toPeers:peerList withDataMode:GKSendDataReliable error:nil]; 
[encoder autorelease];  
[peerList autorelease]; 

}

-(void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession *)session 
     context:(void *)context{ 
NSKeyedUnarchiver *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
int mode = [decoder decodeIntForKey:@"Mode"]; 

switch (mode) { 
    case 0: 
     clusterMap.header = [decoder decodeObjectForKey:@"Header"]; 
     break; 
    default: 
     break; 
} 

}

+0

1. Если вы собираетесь авторекламу, сделайте это немедленно ('[[[[Foo alloc] init ...] autorelease]'). В конце функции нет автореализаций. 2. '[[[[NSArray alloc] init ...] copy]' утечки. –

+0

Хм, странно, я посмотрел несколько руководств, и все они положили авторекламу в конце блока кода. Я думаю, что это может быть вопросом выбора. В конце концов, Autorelease - это просто способ сказать языку, что все в порядке, чтобы избавиться от чего-то, когда это делается с его помощью. Неужели это не имеет значения, если вы делаете это в начале или в конце, если это делается в момент, когда данные все еще живут? – Ash

ответ

0

Я не могу точно сказать, что это окончательный ответ, но я решил проблему после моды путем удаления GKPeerPicker и реализации моего собственного клиента -Серверный код установки, который генерирует сам «keep alive». Я думаю, проблема в том, что я настраивал сеанс вручную, а затем использовал Peer Picker для подключения к нему. Кажется, что Peer Pickers являются только стабильными и полезными, когда они подключаются к другим Peer Pickers.

Смежные вопросы