2013-05-16 79 views
0

我在我的java web服務器和iOS應用程序之間來回發送數據。當我發送單個請求時,它工作正常。然而,當我從iPhone發送10個請求(我的UITableView中的每個單元需要唯一信息)時,請求無法正常工作。讓我來解釋一下發生了什麼:iPhone應用程序和後端通信

我的iOS應用程序正在用服務器返回的數據創建一個NSData對象。我正在使用[NSJSONSerialization JSONObjectWithData]方法將其轉換爲NSDictionary。我收到一個錯誤,指出最後有垃圾數據。當我檢查緩衝區時,我看到我的第一個JSON字符串進來了,但是還附加了下一個JSON字符串。

如何解決我的服務器在一個字符串中發回請求的問題(因爲它處理得太快)。

我正在使用Apple的NSStream類來處理通信。

的代碼在一個位 -

`(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent:` 



case NSStreamEventHasBytesAvailable: 
     { 
      //can read input 
      if (theStream == inputStream) { 
       if (inputStream.hasBytesAvailable) { 
        uint8_t buf[4096]; 
        unsigned int len = 0; 
        len = [inputStream read:buf maxLength:4096]; 
         if(len > 0 && len < 4096) { 
          NSError *error; 
          NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:[NSData dataWithBytes:buf length:len] options:NSJSONReadingAllowFragments error:&error]; 
          if (error) { 

當我檢查錯誤它說,在垃圾末端。我收到一個錯誤,當請求如下所示:

{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abbott, Philip C","overall":2,"reviews":21}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abel, Gavin Paul","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abel, Steven Richard","overall":5,"reviews":1}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abney, Scott A","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abraham, Dulcy M","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abraham, John ","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abramova, Inna ","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abu-Omar, Mahdi M","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Acharya, Lalatendu ","overall":0,"reviews":0}]}{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Acosta, Glen G","overall":0,"reviews":0}]} 

,而不是單一的請求是這樣的:

{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abbott, Philip C","overall":2,"reviews":21}]} 


{"command":"PROFESSOR_RATING","error":false,"data":[{"professor":"Abel, Gavin Paul","overall":0,"reviews":0}]} 

..和等等

如何分割這件事到每個JSON字符串?我有什麼選擇?我需要改變我的服務器發送數據的方式嗎?

服務器:

String request = commands[1]; 
String results = submitReview(request);      
bw.write(results); 
bw.flush(); 

我已經手動試圖通過它解析,但遇到問題時,我有一個完整的請求(有效的JSON字符串),由長JSON字符串(這是不正確的,因爲附加它不適合緩衝區,其餘的將在下一個inputStream事件中發送))。有沒有人有什麼建議?

非常感謝。

-Kamran

+0

你如何下載數據?你有沒有試過使用像AFNetworking這樣的圖書館? – Antzi

+0

我剛剛編輯了這篇文章,因爲我不小心將其遺漏了。我正在使用NSStream與我的服務器通信。 – kamran619

回答

0

我有我的應用程序非常相似的需求,我們使用AFNetworking stuff。它讓我有多個流將單獨的數據塊分開,並且非常棒。由於我們的多線程,我知道我們的Android應用程序甚至無法在性能上接近我們。

您可以排隊多個請求,然後讓隊列管理器將它們從您想要一次執行的線程拉出,並且擁有成功和失敗塊。

我們設置的東西像這樣:

AFJSONRequestOperation *operation = [[AFJSONRequestOperation alloc] initWithRequest:request]; 
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id array) { 
     [processingQueue_ addOperationWithBlock:^{ 
      [self.syncDelegate saveBigs:array]; 
      [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
       [self finished:title]; 
      }]; 
     }]; 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     [self failed:title error:error retrySelector:@selector(getBigs) withObject:nil errorCode:operation.response.statusCode type:NETWORK_OPERATION_TYPE_BIG]; 
    }]; 

    [queue_ addOperation:operation]; 
+0

我可能是錯的,但我不認爲問題在於我如何在前端處理網絡,但我的服務器如何繼續發送數據。我認爲所使用的技術並不像數據分散的方式那樣相關。 – kamran619

+0

如果你去AFNetworking,我仍然認爲你會少一些悲傷。 – HalR