MultipeerConnectivity - MCNearbyServiceBrowser постоянно находит отключенных партнеров
Я работаю с MultipeerConnectivity Apple Framework. Соединение, рекламодатель и браузер, кажется, работают очень хорошо до сих пор, но я замечаю, что, когда моя любая сессия соединяется с партнером, тогда он отключается по любой причине. MCNearbyServiceBrowser
все еще находя этого пира, даже если его больше не существует. очевидно MCSession
сообщает о не связанном состоянии со сверстником.
У кого-нибудь есть представление о том, почему это происходит?
Я переопределил метод dealloc в моем классе обработчика mc следующим образом:
- (void)dealloc
{
[self.session disconnect];
self.peerId = nil;
self.session = nil;
self.browser = nil;
self.advertiser = nil;
self.session.delegate = nil;
self.browser.delegate = nil;
self.advertiser.delegate = nil;
}
И у меня также есть метод сноса:
- (void)teardownService
{
[self.session disconnect];
self.session = nil;
self.advertiser = nil;
self.browser = nil;
self.session.delegate = nil;
self.browser.delegate = nil;
self.advertiser.delegate = nil;
}
Эта проблема возникает со всеми устройствами.
1 ответ
Я нашел действительно полезный ответ на форумах Apple Dev.
Здесь ссылка.
В основном это решило проблему утилизации MCPeerID
, Когда объект создан, я сериализую его и сохраняю в NSUserDefaults
, И в любое время мне нужно вернуть его обратно, например, когда я срываю сервис и запускаю его снова, я перехожу к сохраненному объекту и использую его вместо создания нового.
Вы можете найти следующий пример кода в прикрепленной ссылке выше:
- (MCPeerID *)peerID {
if (!_peerID) {
_peerID = [MyClassName getRecycledPeerID];
}
return _peerID;
}
+ (MCPeerID *)getRecycledPeerID
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// if peer id exists, use that; else create one
if ([defaults objectForKey:kRECYCLED_PEER_ID]) {
NSData *peerIDData = [defaults dataForKey:kRECYCLED_PEER_ID];
return [NSKeyedUnarchiver unarchiveObjectWithData:peerIDData];
}
else {
return [[MCPeerID alloc] initWithDisplayName:[UIDevice currentDevice].name];
}
}