IOS/AFNetworking:将两个 JSON 操作排入队列,然后比较返回的 NSArrays

Posted

技术标签:

【中文标题】IOS/AFNetworking:将两个 JSON 操作排入队列,然后比较返回的 NSArrays【英文标题】:IOS/AFNetworking: enqueue two JSON operations and then compare the returned NSArrays 【发布时间】:2013-01-21 09:43:56 【问题描述】:

对于我的应用,我必须连接到两个返回 JSON 的网络服务。

我首先使用 GCD 编写了自己的网络代码,但看到 AFNetworking 处理事情的方式,我决定实现它。大多数事情都很顺利,但在某些时候我正在检索两个充满对象的数组。然后使用不同的方法比较这两个数组。不知何故,实际排队要么延迟要么不起作用,具体取决于我使用的代码。

使用时:

NSArray *operations = [NSArray arrayWithObjects:operation, operation1, nil];
        AFHTTPClient *client = [[AFHTTPClient alloc]init];

        [client enqueueBatchOfHTTPRequestOperations:operations progressBlock:nil completionBlock:^(NSArray *operations) 
            [self compareArrays:self];
        

它只是挂起。

使用时:

 [operation start];
    [operation1 start];
    [operation waitUntilFinished];
    [operation1 waitUntilFinished];

    [self compareArrays:self];

最后,它获取数组,但仅在 UI 形成后进行比较。

编辑: 我检查了戴夫的答案,它看起来真的很精简。 我的应用程序会从使用AFHTTPClient 中受益,还是这种方法(使用AFJSONRequestOperation)提供相同的功能?我记得AFHTTPClient 现在自己处理可达性(尽管您需要设置它)。我摆弄了一下,得到了这个工作:

NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    WebServiceStore *wss = [WebServiceStore sharedWebServiceStore];
    self.userData = wss.userData;
    serviceURL = [NSString stringWithFormat: @"WEBSERVICE URL"];
    NSString* zoekFruit = [NSString stringWithFormat:
                           @"%@?customer=%@&gebruiker=%@&password=%@&breedte=%@&hoogte=%@&diameter=%@",
                           serviceURL,
                           self.userData.Klant,
                           self.userData.Gebruiker,
                           self.userData.Wachtwoord,
                           breedte,
                           hoogte,
                           diameter];

    NSURL *url = [NSURL URLWithString:[zoekFruit stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]];

        NSURLRequest *request = [NSURLRequest requestWithURL:url];

        AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) 
            id results = [JSON valueForKey:@"data"];

            [results enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 

                //Initiate the BWBand

                BWBand *band = [[BWBand alloc]init];

                //Set the BWBand's properties with valueforKey (or so).                    

                [getBandenArray addObject:band];
            ];

            NSLog(@"getBandenArray: %@",getBandenArray);

         failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) 
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Error retrieving Banden" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
            [alert show];
        ];

       [queue addOperation:operation];

【问题讨论】:

【参考方案1】:

AFNetworking 类将允许您创建一堆操作,然后将它们全部交给处理。您添加一些代码以在每个单独请求的成功/失败和/或所有请求都已处理时发生。

以下是您可能会做的事情的概要。我将把细节、实际比较和错误处理留给你想象。 :)

-(void)fetchAllTheData 
    NSMutableArray * operations = [NSMutableArray array];
    for (NSString * url in self.urlsToFetchArray) 
        [operations addObject:[self operationToFetchSomeJSON:url]];
    
    AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:[PREFS objectForKey:@"categoryUrlBase"]]];
    [client enqueueBatchOfHTTPRequestOperations:operations
                                  progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) 
                                      NSLog(@"Finished %d of %d", numberOfFinishedOperations, totalNumberOfOperations);
                                  
                                completionBlock:^(NSArray *operations) 
                                    DLog(@"All operations finished");
                                    [[NSNotificationCenter defaultCenter] postNotificationName:@"Compare Everything" object:nil];
                                ];


-(AFHTTPRequestOperation *)operationToFetchSomeJSON:(NSString*)whichOne 
    NSURL * jsonURL = [NSURL URLWithString:whichOne];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:jsonURL];
    [request setHTTPShouldHandleCookies:NO];
    [request addValue:@"application/json" forHTTPHeaderField:@"Accept"];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) 
        NSLog(@"My data = %@", operation.responseString); // or responseData
        // Got the data; save it off.
     failure:^(AFHTTPRequestOperation *operation, NSError *error) 
        DLog(@"Error downloading: %@  %@", whichOne, error);
    ];
    return operation;

希望对您有所帮助。

【讨论】:

嗨戴夫!看起来真的很棒!我已经编辑了我的答案,因为我想知道我提出的解决方案是否可以与您刚刚建议的方案进行比较。我相信 AFHTTPClient 是更好的选择,但它是否添加了任何东西而不是使用 AFJSONRequestOperation?对不起,如果这听起来有点愚蠢,但我只是从图书馆开始:)。提前致谢! 您可以使用 JSON 方法。我修改了我的示例,但最初是获取图像,因此 http 在那种情况下对我来说效果更好。很抱歉误导。 没问题!你帮了我大忙,因为在我阅读了你的答案之后,我只是通过 AFHTTPClient 轻松地通过管道传输了这些 JSON 请求!我所做的只是使用 AFJSONRequestOperation 代替。两全其美;)

以上是关于IOS/AFNetworking:将两个 JSON 操作排入队列,然后比较返回的 NSArrays的主要内容,如果未能解决你的问题,请参考以下文章

iOS,AFNetworking - 带有 JSON 响应的“清除”NSSTring [关闭]

IOS AFNetworking的使用与YYModel解析JSON数据

iOS AFNetworking & Json 数据

IOS AFNetworking的使用与YYModel解析JSON数据

最佳实践以及如何在 Symfony2 中找到从 iOS AFNetworking 获取 POST 数据并在 GET 中返回 JSON?

生成新单元格时清除集合视图单元格(iOS7 - AFNetworking)