2013-05-16 80 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