2013-03-27 25 views
1

我有一個將JSON結果異步傳輸回iOS客戶端的Web服務器。該客戶端使用NSURLConnection的連接,我從方法訪問數據:目前如何在將JSON數據流式傳輸到NSURLConnection時處理分塊

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData) 

數據是回來在1024個字節塊。但是,我不知道如何判斷何時收到數據(如果郵件已完成),而不是將所有收到的數據附加到字符串,並嘗試每次將其解析爲JSON。這種方法似乎很容易出錯 - 是否有更好的方法來處理這個問題?有什麼會標記在標題或什麼時候發送完整的響應?

+0

多大JSON包?你擔心連接會丟失部分JSON,還是有其他原因? – bgoers 2013-03-27 18:57:32

+0

服務器一次只發送1024個字節的數據。我擁有的數據將很容易爲每個請求10 kb。 – lehn0058 2013-03-27 19:00:29

+0

10KB真的很小。但是如下所述,有一個委託方法告訴你數據何時完成發送。 – bgoers 2013-03-27 19:03:50

回答

2

有兩種方式

第一&更好的辦法是實現connectionDidFinishLoading:NSURLConnectionDataDelegate委託時,連接已經完成成功加載,這將觸發。

第二種方式是手動處理它,如下所示。

你可以做以下的事情在網絡服務器端,

第一步:首先開始發送原始數據之前發送以下信息。

 a.Number of Chunks.[totalSize/1024] (mandatory). 
     b.TotalSize(not mandatory). 

你可以做以下的事情在客戶並肩,

第一步:存儲上述信息。

第二步:寫下面的代碼

@property (nonatomic,assign) int chunkNumber; 

@property (nonatomic,strong) NSData *receivedData; 

Self.chunkNumber = 1; 

    -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData)myata{ 

     if(self.chunkNumber != Number of Chunks) 
     { 
      if(!self.receivedData) 
      { 
      //allocate and initialize self.receivedData 
      } 

      [self.receivedData appendData:myData];  

     } 
     else 
     { 

     //completed . do whatever with self.receivedData. 
     //if you want to validate, just check the self.receivedData size with TotalSize 

     self.chunkNumber = 1; 

     } 

    } 
+0

方法#1在我的情況下不起作用,因爲我正在流回數據並且長時間打開異步連接,所以服務器可以在客戶端可用時將結果推送給客戶端。 connectionDidFinishLoading方法只有在連接實際關閉時纔會被調用。我希望避免實施方法#2,但也許這是我最好的選擇。 – lehn0058 2013-03-28 13:01:14

1

在NSURLConnectionDataDelegate中,有一個方法connectionDidFinishLoading:應在服務器完成發送時調用。您還可以檢索didReceiveResponse中的預期長度,但這不可靠並且需要服務器端支持。

+0

connectionDidFinishLoading在我的情況下不起作用,因爲我正在流回數據並且長時間打開異步連接,所以服務器可以在客戶端可用時將結果推送給客戶端。 connectionDidFinishLoading方法只有在連接實際關閉時纔會被調用。 – lehn0058 2013-03-28 12:56:02

相關問題