iPhone应用程序和后端通信

时间:2013-05-16 00:02:24

标签: java ios objective-c json networking

我在java webserver和iOS app之间来回发送数据。当我发送单个请求时,它工作正常。但是,当我从iPhone发送10个请求时(我的UITableView中的每个单元一个请求需要唯一信息),请求无法正常工作。让我解释一下发生了什么:

我的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字符串)时会遇到问题,附加一个LONG Json字符串(由于它不适合缓冲区而无效,并且rest将在下一个inputStream事件中发送))。有没有人有什么建议?

非常感谢。

-Kamran

1 个答案:

答案 0 :(得分: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];