Не могу понять, почему это происходит, но когда я использую 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;
}
}
1. Если вы собираетесь авторекламу, сделайте это немедленно ('[[[[Foo alloc] init ...] autorelease]'). В конце функции нет автореализаций. 2. '[[[[NSArray alloc] init ...] copy]' утечки. –
Хм, странно, я посмотрел несколько руководств, и все они положили авторекламу в конце блока кода. Я думаю, что это может быть вопросом выбора. В конце концов, Autorelease - это просто способ сказать языку, что все в порядке, чтобы избавиться от чего-то, когда это делается с его помощью. Неужели это не имеет значения, если вы делаете это в начале или в конце, если это делается в момент, когда данные все еще живут? – Ash