2013-01-03 95 views
0

我正在研究可以向用戶發送文件和操作的應用程序。用戶可以隨時從服務器(客戶端服務器型號)請求文件。 有時文件可能相當大(例如10 MB),同時發送可以將其他小動作延遲發送給連接的用戶。 似乎Gamekit有一個發送線程和一個單獨的接收線程。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]; 

}); 

我想這將有可能得到單獨的小行動包「中斷」大文件發送,但是這將是相當複雜的,我想知道如果有一個更簡單的方法。

回答

0

說實話我沒有GameKit的經驗,但最終它必須是一個流套接字,對嗎? 而不是試圖用10mb文件發送一個巨大的數據包,爲什麼不發送它在較小的100kb塊。這樣,您就可以等待它完成並排隊您提到的不同類型的數據包(較小的動作數據包),而不用中斷數據塊。另一方面,這只是將大文件的各個部分附加在一起的問題,但如果你有其他的東西,你就可以處理它。通過這種方式,您可以獲得更高的響應度

+0

我目前正在將文件拆分成數據包。這些然後發送在一個循環(我假設它添加了他們所有的隊列)。我想我需要的是能夠將行動數據包添加到隊列的前端,但不確定是否可行。 – bencallis

+0

不要這麼做(對隊列順序來說不好),而是隻需排隊第一個數據包,並在完成時設置某種回調。完成發送後排隊等待下一個。 –

2

GKSession在自己的線程上完成所有的實際網絡。查看lldb/Xcode瞭解更多詳情。如果你想發送10MB塊,只需發送數據。 GKSession會爲您寫入這些寫入,並在可能的情況下在後臺線程上發送。換句話說,不要擔心扼殺主線程,只需寫入數據即可。