GameKit Возможна ли многопоточная отправка?

Я работаю над приложением, которое может отправлять файлы и действия пользователям. Пользователи могут запросить файл в любое время с сервера (модель клиент-сервер). Иногда файлы могут быть довольно большими (например, 10 МБ), что при отправке может задержать отправку других небольших действий подключенным пользователям. Похоже, что Gamekit имеет один поток для отправки и отдельный для получения.

Мне интересно, возможно ли иметь дополнительный поток отправки, чтобы меньшие пакеты действий не ожидали отправки большого файла. Я попытался создать очередь с большой центральной диспетчеризацией, но, к сожалению, отправка по-прежнему использовала только один поток.

dispatch_async(pdfSendQ, ^{

    NSString *filePath = [_document.fileURL path] ;


    if (!_pdfNSData)
        _pdfNSData = [NSData dataWithContentsOfFile:filePath];

    for(NSData* packet in self.packets) {
        NSError* error = nil;
        [_session sendData:packet toPeers:[NSArray arrayWithObject:peerID] withDataMode:GKSendDataReliable error:&error];
        if(error != nil) {
            [[NSNotificationCenter defaultCenter] postNotificationName:kPacketFailedNotification object:self userInfo:[NSDictionary dictionaryWithObject:error forKey:@"error"]];
        } else {
            [[NSNotificationCenter defaultCenter] postNotificationName:kPacketSentNotification object:self];
        }
    }
    [[NSNotificationCenter defaultCenter] postNotificationName:kFileSentNotification object:self];

});

Я думаю, что было бы возможно получить отдельные меньшие пакеты действий, чтобы "прервать" отправку большого файла, однако это было бы довольно сложно, и мне было интересно, существует ли намного более простой способ.

2 ответа

GKSession делает все действующие сети в своем собственном потоке. Посмотрите в lldb / Xcode для более подробной информации. Если вы хотите отправить 10 МБ порциями, просто отправьте данные. GKSession поставит в очередь записи для вас и отправит, когда это возможно, в фоновом потоке. Другими словами, не беспокойтесь об истощении основного потока, просто запишите данные.

Если честно, у меня нет опыта работы с GameKit, но, в конце концов, это должен быть потоковый сокет, верно? Вместо того, чтобы пытаться отправить огромный пакет с файлом 10 МБ, почему бы не отправить его небольшими кусками по 100 КБ. таким образом, вместо прерывания промежуточного блока, вы можете просто дождаться его завершения и поставить в очередь другой тип пакета (меньшие пакеты действия), о котором вы упомянули. С другой стороны, это просто вопрос сложения частей большого файла, но если вы получите что-то еще, вы сможете обработать его. Таким образом, вы получите его более отзывчивым

Другие вопросы по тегам