ios - iOS从服务器内部获取数据以进行循环

标签 ios objective-c web-services nsurlsession

我想通过for循环内的多个调用从服务器获取数据。我每次都传递不同的参数。我知道可以像下面的代码那样获取数据:

for (NSDictionary *feedItem in [feed objectForKey:@"content"]) {
    // url with feedItem data.
    NSURL *url = ....
    [UrlMethod GetURL:url success:^(NSDictionary *placeData) {
        if (placeData) {
            dispatch_async(dispatch_get_main_queue(), ^{
                // adding object to table data source array
                [dataSourceArray addObject:[placeData objectForKey:@"data"]];
                // reloading table view.
                [self.tableView reloadData];

                });
            }
       } failure:^(NSError *error) {

       }];
}

问题是,每当我将数据添加到dataSourceArry时,它就不会按顺序添加。它根据API调用的响应进行添加。请让我知道,如果不清楚。

最佳答案

在您的情况下,我将首先分配一个可变数组,并在每个位置设置[NSNull null]:

NSInteger count = [[feed objectForKey:@"content"] count];
NSMutableArray *dataSourceArray = [NSMutableArray arrayWithCapacity:count];

for (NSInteger i = 0; i < count; ++i) {
    [dataSourceArray addObject:[NSNull null]];
}

然后,我将使用一种称为调度组的东西(更多信息请参见http://commandshift.co.uk/blog/2014/03/19/using-dispatch-groups-to-wait-for-multiple-web-services/):
__block NSError *apiCallError = nil; // Just to keep track if there was at least one API call error
NSInteger index = 0;

// Create the dispatch group
dispatch_group_t serviceGroup = dispatch_group_create();

for (NSDictionary *feedItem in [feed objectForKey:@"content"]) {

    // Start a new service call
    dispatch_group_enter(serviceGroup);

    // url with feedItem data.
    NSURL *url = ...

    [UrlMethod GetURL:url success:^(NSDictionary *placeData) {
        if (placeData) {
            dispatch_async(dispatch_get_main_queue(), ^{
                // Add data to Data Source
                // index should be the correct one, as the completion block will contain a snapshot of the corresponding value of index
                dataSourceArray[index] = [placeData objectForKey:@"data"];
            }

            dispatch_group_leave(serviceGroup);
       } failure:^(NSError *error) {
           apiCallError = error;
           dispatch_group_leave(serviceGroup);
       }];

     index++; 
}

dispatch_group_notify(serviceGroup, dispatch_get_main_queue(),^{
    if (apiCallError) {
        // Make sure the Data Source contains no [NSNull null] anymore
        [dataSourceArray removeObjectIdenticalTo:[NSNull null]];
    }

    // Reload Table View
    [self.tableView reloadData];
});

希望对你有效。

关于ios - iOS从服务器内部获取数据以进行循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40944318/

相关文章:

java - 作为变量传递时,Thymeleaf 片段无法解析,即 <div th :replace ="${page}">

web-services - 调试 asmx 网络服务

ios - 如何制作这个动画?即。连接共享元素

ios - 如何: Report download progress for CloudKit operations

objective-c - 使用 LLVM 生成 ObjC 代码

ios - 如何在 AVPlayer 中提取 MPMediaItemCollection 到 NSData?

objective-c - 如何在 Objective-C 中实例化一个不从 NSObject 继承的类

java - 如何在java中的soap header中添加子元素

ios - 如何为 UIButton 的操作设置每小时限制?

ios - UIViewController 上的多个 shadowOffset