Почему соединение Multipeer настолько медленное?

Итак, у меня есть весь связанный с межсетевым соединением код в основном потоке. У меня есть MCSession, MCNearbyServiceAdvertiser, and a MCNearbyServiceBrowser . Все они созданы с помощью peerID, и я убеждаюсь, что только один отправляет приглашение.

Сессия становится связанной. Мои проблемы состоят в том, что для подключения двух клиентов требуется около 20-30 секунд. Это неприемлемо. Клиенты находятся на хорошем Wifi и bluetooth. Я хочу, чтобы просмотр, приглашение и подключение выполнялись в течение 1 секунды . Кто-нибудь знает, что замедляет работу?

Код точно такой, как указано здесь, и я также реализовал certificateHandler(YES)

 @interface SessionController () // Class extension @property (nonatomic, strong) MCPeerID *peerID; @property (nonatomic, strong) MCSession *session; @property (nonatomic, strong) MCNearbyServiceAdvertiser *serviceAdvertiser; @property (nonatomic, strong) MCNearbyServiceBrowser *serviceBrowser; // Connected peers are stored in the MCSession // Manually track connecting and disconnected peers @property (nonatomic, strong) NSMutableOrderedSet *connectingPeersOrderedSet; @property (nonatomic, strong) NSMutableOrderedSet *disconnectedPeersOrderedSet; @end @implementation SessionController static NSString * const kMCSessionServiceType = @"mcsessionp2p"; #pragma mark - Initializer - (instancetype)init { self = [super init]; if (self) { _peerID = [[MCPeerID alloc] initWithDisplayName:[[UIDevice currentDevice] name]]; _connectingPeersOrderedSet = [[NSMutableOrderedSet alloc] init]; _disconnectedPeersOrderedSet = [[NSMutableOrderedSet alloc] init]; NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; // Register for notifications [defaultCenter addObserver:self selector:@selector(startServices) name:UIApplicationWillEnterForegroundNotification object:nil]; [defaultCenter addObserver:self selector:@selector(stopServices) name:UIApplicationDidEnterBackgroundNotification object:nil]; [self startServices]; _displayName = self.session.myPeerID.displayName; } return self; } #pragma mark - Memory management - (void)dealloc { // Unregister for notifications on deallocation. [[NSNotificationCenter defaultCenter] removeObserver:self]; // Nil out delegates _session.delegate = nil; _serviceAdvertiser.delegate = nil; _serviceBrowser.delegate = nil; } #pragma mark - Override property accessors - (NSArray *)connectedPeers { return self.session.connectedPeers; } - (NSArray *)connectingPeers { return [self.connectingPeersOrderedSet array]; } - (NSArray *)disconnectedPeers { return [self.disconnectedPeersOrderedSet array]; } #pragma mark - Private methods - (void)setupSession { // Create the session that peers will be invited/join into. _session = [[MCSession alloc] initWithPeer:self.peerID]; self.session.delegate = self; // Create the service advertiser _serviceAdvertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:self.peerID discoveryInfo:nil serviceType:kMCSessionServiceType]; self.serviceAdvertiser.delegate = self; // Create the service browser _serviceBrowser = [[MCNearbyServiceBrowser alloc] initWithPeer:self.peerID serviceType:kMCSessionServiceType]; self.serviceBrowser.delegate = self; } - (void)teardownSession { [self.session disconnect]; [self.connectingPeersOrderedSet removeAllObjects]; [self.disconnectedPeersOrderedSet removeAllObjects]; } - (void)startServices { [self setupSession]; [self.serviceAdvertiser startAdvertisingPeer]; [self.serviceBrowser startBrowsingForPeers]; } - (void)stopServices { [self.serviceBrowser stopBrowsingForPeers]; [self.serviceAdvertiser stopAdvertisingPeer]; [self teardownSession]; } - (void)updateDelegate { [self.delegate sessionDidChangeState]; } - (NSString *)stringForPeerConnectionState:(MCSessionState)state { switch (state) { case MCSessionStateConnected: return @"Connected"; case MCSessionStateConnecting: return @"Connecting"; case MCSessionStateNotConnected: return @"Not Connected"; } } #pragma mark - MCSessionDelegate protocol conformance - (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state { NSLog(@"Peer [%@] changed state to %@", peerID.displayName, [self stringForPeerConnectionState:state]); switch (state) { case MCSessionStateConnecting: { [self.connectingPeersOrderedSet addObject:peerID]; [self.disconnectedPeersOrderedSet removeObject:peerID]; break; } case MCSessionStateConnected: { [self.connectingPeersOrderedSet removeObject:peerID]; [self.disconnectedPeersOrderedSet removeObject:peerID]; break; } case MCSessionStateNotConnected: { [self.connectingPeersOrderedSet removeObject:peerID]; [self.disconnectedPeersOrderedSet addObject:peerID]; break; } } [self updateDelegate]; } - (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID { // Decode the incoming data to a UTF8 encoded string NSString *receivedMessage = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"didReceiveData %@ from %@", receivedMessage, peerID.displayName); } - (void)session:(MCSession *)session didStartReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID withProgress:(NSProgress *)progress { NSLog(@"didStartReceivingResourceWithName [%@] from %@ with progress [%@]", resourceName, peerID.displayName, progress); } - (void)session:(MCSession *)session didFinishReceivingResourceWithName:(NSString *)resourceName fromPeer:(MCPeerID *)peerID atURL:(NSURL *)localURL withError:(NSError *)error { NSLog(@"didFinishReceivingResourceWithName [%@] from %@", resourceName, peerID.displayName); // If error is not nil something went wrong if (error) { NSLog(@"Error [%@] receiving resource from %@ ", [error localizedDescription], peerID.displayName); } else { // No error so this is a completed transfer. The resources is located in a temporary location and should be copied to a permenant location immediately. // Write to documents directory NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *copyPath = [NSString stringWithFormat:@"%@/%@", [paths firstObject], resourceName]; if (![[NSFileManager defaultManager] copyItemAtPath:[localURL path] toPath:copyPath error:nil]) { NSLog(@"Error copying resource to documents directory"); } else { // Get a URL for the path we just copied the resource to NSURL *url = [NSURL fileURLWithPath:copyPath]; NSLog(@"url = %@", url); } } } // Streaming API not utilized in this sample code - (void)session:(MCSession *)session didReceiveStream:(NSInputStream *)stream withName:(NSString *)streamName fromPeer:(MCPeerID *)peerID { NSLog(@"didReceiveStream %@ from %@", streamName, peerID.displayName); } #pragma mark - MCNearbyServiceBrowserDelegate protocol conformance // Found a nearby advertising peer - (void)browser:(MCNearbyServiceBrowser *)browser foundPeer:(MCPeerID *)peerID withDiscoveryInfo:(NSDictionary *)info { NSString *remotePeerName = peerID.displayName; NSLog(@"Browser found %@", remotePeerName); MCPeerID *myPeerID = self.session.myPeerID; BOOL shouldInvite = ([myPeerID.displayName compare:remotePeerName] == NSOrderedDescending); if (shouldInvite) { NSLog(@"Inviting %@", remotePeerName); [browser invitePeer:peerID toSession:self.session withContext:nil timeout:30.0]; } else { NSLog(@"Not inviting %@", remotePeerName); } [self updateDelegate]; } - (void)browser:(MCNearbyServiceBrowser *)browser lostPeer:(MCPeerID *)peerID { NSLog(@"lostPeer %@", peerID.displayName); [self.connectingPeersOrderedSet removeObject:peerID]; [self.disconnectedPeersOrderedSet addObject:peerID]; [self updateDelegate]; } - (void)browser:(MCNearbyServiceBrowser *)browser didNotStartBrowsingForPeers:(NSError *)error { NSLog(@"didNotStartBrowsingForPeers: %@", error); } #pragma mark - MCNearbyServiceAdvertiserDelegate protocol conformance - (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void(^)(BOOL accept, MCSession *session))invitationHandler { NSLog(@"didReceiveInvitationFromPeer %@", peerID.displayName); invitationHandler(YES, self.session); [self.connectingPeersOrderedSet addObject:peerID]; [self.disconnectedPeersOrderedSet removeObject:peerID]; [self updateDelegate]; } - (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didNotStartAdvertisingPeer:(NSError *)error { NSLog(@"didNotStartAdvertisingForPeers: %@", error); } @end 

One Solution collect form web for “Почему соединение Multipeer настолько медленное?”

Я заметил эту проблему, и я не могу понять, что происходит здесь, она появляется при отладке, что существует огромная задержка между уведомлением об изменении состояния, которое может быть запущено, возможно, что-то связано с самим представлением.

Обновление: Ну, я думаю, что я понял проблемы после небольшого чтения, ответ довольно много сейчас, в уведомлении в представлении я вернул процесс обратно в основной поток, например:

 -(void)peerDidChangeStateWithNotification:(NSNotification *)notification{ MCPeerID *peerID = [[notification userInfo] objectForKey:@"peerID"]; NSString *peerDisplayName = peerID.displayName; MCSessionState state = [[[notification userInfo] objectForKey:@"state"] intValue]; if (state != MCSessionStateConnecting) { if (state == MCSessionStateConnected) { // add the user [arrConnectedDevices addObject:peerDisplayName]; } else if (state == MCSessionStateNotConnected){ // do we have connections if ([arrConnectedDevices count] > 0) { int indexOfPeer = [arrConnectedDevices indexOfObject:peerDisplayName]; [arrConnectedDevices removeObjectAtIndex:indexOfPeer]; } } } // push to main queue for speedy response dispatch_async(dispatch_get_main_queue(), ^(void) { [collView reloadData]; BOOL peersExist = ([[appDelegate.mcManager.session connectedPeers] count] == 0); NSLog(@"PEER COUNT IS %lu",(unsigned long)[[appDelegate.mcManager.session connectedPeers] count]); [disconnectButton setEnabled:!peersExist]; if ([disconnectButton isEnabled]) { [disconnectButton setBackgroundColor:[UIColor colorWithRed:(51/255.0) green:(202/255.0) blue:(168/255.0) alpha:1.0]]; } else{ [disconnectButton setBackgroundColor:[UIColor colorWithRed:(107/255.0) green:(107/255.0) blue:(107/255.0) alpha:1.0]]; } }); } 

Надеюсь, это поможет любому, кто столкнулся с проблемами.

  • Есть ли такая система визуализации, как JUNG для iOS?
  • Код приложения Store отличается от кода Xcode / Device на iPhone 3G
  • Как сохранить текущий элемент панели вкладок, когда пользователь завершает работу и перезагружается в этот элемент при перезапуске?
  • Кнопка iOS 7 с круглой рамкой
  • Изменения цвета клавиатуры iOS - keyboardAppearance темный цвет не прилипает
  • NSExpression относится к подпрограмме NSPredicate
  • Почему свойство привязанности UNNotificationContent NSArray (против единого UNNotificationAttachment)?
  • Как перетащить контроль, как голос Тиндера? (см. изображения)
  • IOS 5 Как изменить цвет кнопки «Назад» на панели навигации?
  • Цвет выделения UIButton
  • Создание Launch Screen.xib для iOS8
  • Interesting Posts

    Это IP, сайт или мобильное приложение не имеет права использовать этот ключ API. Как исправить эту проблему для приложения ios?

    Как оптимизировать calcOpticalFlowPyrLK для opencv?

    UIImagePickerController не отображается (требуется больше времени для загрузки). Предварительный просмотр камеры в ios7

    Удаление уведомлений на основе местоположения, когда пользователь выходит из региона

    Facebook ios sdk 3.0 активная сессия FBiOSSDK error2

    Съемка с помощью кнопки регулировки громкости

    Как установить метод тестирования, который вызывает NSDate ()?

    Что может вызвать этот крах в потоке libdispatch-manager?

    Сдвиг UIView для частичного перекрытия другого UIView

    Как заставить UITextField двигаться вверх, когда клавиатура присутствует?

    Соглашения об именах делегатов iOS – должны, будут,

    Запретить редактирование текста в UITextField и скрыть курсор / каретку / увеличительное стекло при использовании inputView

    Получение префикса вызовов в стране

    Как получить номер метки UIButton

    Хранить изображения в sqlite или просто ссылки на него?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.