0

我正在开发一个可以向用户发送文件和操作的应用程序。用户可以随时从服务器请求文件(客户端服务器模型)。有时文件可能相当大(例如 10 mb),在发送时可能会延迟其他小动作发送给连接的用户。似乎 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];

});

我想有可能让单独的较小的动作数据包“中断”大文件的发送,但这会相当复杂,我想知道是否有更简单的方法。

4

2 回答 2

2

GKSession 在它自己的线程上完成所有实际的网络连接。查看 lldb / Xcode 了解更多详细信息。如果要分块发送 10MB,只需发送数据即可。GKSession 将为您排入队列并尽可能在后台线程上发送。换句话说,不用担心饿死主线程,直接写数据就行了。

于 2013-03-13T20:52:52.277 回答
0

老实说我没有使用GameKit的经验,但最终它必须是一个流套接字,对吧?与其尝试使用 10mb 文件发送一个巨大的数据包,不如以更小的 100kb 块发送它。这样,您可以等待它完成并将您提到的不同类型的数据包(较小的动作数据包)排队,而不是中断中间块。另一方面,只需将大文件的各个部分附加在一起,但如果你得到其他东西,你将能够处理它。这样你会得到更快的响应

于 2013-01-03T19:36:38.727 回答