Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从用于循环的服务器中获取数据的iOS

从用于循环的服务器中获取数据的iOS
EN

Stack Overflow用户
提问于 2016-12-02 20:42:35
回答 5查看 1.1K关注 0票数 1

我希望从具有多个调用for循环的服务器中获取数据。每次我都传递不同的参数。我知道获取数据是可能的,比如,我在下面的代码中获取:

代码语言:javascript
运行
AI代码解释
复制
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调用的响应添加的。如果不清楚,请告诉我。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-12-02 22:08:39

在您的示例中,我首先分配一个可变数组,并在每个位置设置NSNull null:

代码语言:javascript
运行
AI代码解释
复制
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/):

代码语言:javascript
运行
AI代码解释
复制
__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];
});

希望它对你有用。

票数 2
EN

Stack Overflow用户

发布于 2016-12-02 21:43:51

这可能对你有帮助,

代码语言:javascript
运行
AI代码解释
复制
 //keep dictionary property which will store responses
    NSMutableDictionary *storeResponses = [[NSMutableDictionary alloc]init];

    //Somewhere outside function keep count or for loop
    NSInteger count = 0;

    for (NSDictionary *feedItem in [feed objectForKey:@"content"]) {
        //Find out index of feddItem
        NSInteger indexOfFeedItem = [[feed objectForKey:@"content"] indexOfObject:feedItem];

        NSString *keyToStoreResponse = [NSString stringWithFormat:@"%d",indexOfFeedItem];

        // url with feedItem data.
        NSURL *url = ....
        [UrlMethod GetURL:url success:^(NSDictionary *placeData) {
            if (placeData) {
                //instead of storing directly to array like below
                // adding object to table data source array
                [dataSourceArray addObject:[placeData objectForKey:@"data"]];

                //follow this
                //increase count
                count++;
                [storeResponses setObject:[placeData objectForKey:@"data"] forKey:keyToStoreResponse];


                // reloading table view.
                if(count == [feed objectForKey:@"content"].count)
                {
                    NSMutableArray *keys = [[storeResponses allKeys] mutableCopy]; //or AllKeys
                    //sort this array using sort descriptor
                    //after sorting "keys"

                    for (NSString *key in keys)
                    {
                        //add them serially

                        [dataSourceArray addObject:[storeResponses objectForKey:key]];
                    }

                    dispatch_async(dispatch_get_main_queue(), ^{


                        [self.tableView reloadData];



                    });
                }

            }
        } failure:^(NSError *error) {

        }];
    }

编辑:我给出的答案是直接写在这里的,您在实际运行这段代码时可能会遇到编译错误。

票数 1
EN

Stack Overflow用户

发布于 2016-12-02 21:49:31

这是因为您正在异步调用web服务,所以它不能保证按照您的请求按顺序进行响应!

现在解决办法是:

  • 您应该编写api,就像它一次给出所有数据一样。所以,你不需要做很多的网络呼叫,它也会提高性能!
  • 第二件事,你可以做递归类型的函数,我的意思是提出另一个请求从completion handler的上一个。在这种情况下,一旦您得到响应,那么只有另一个请求将被初始化,但在这种情况下,您将不得不妥协与性能!!所以第一种解决方案对我来说更好!
  • 另一件事是,在得到所有响应之后,可以对数组排序,然后重新加载tableView
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40944318

复制
相关文章
【分享】并行或串行运行多个NPM脚本的CLI工具
Dear,大家好,我是“前端小鑫同学”,😇长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~ 背景介绍: 我们的node项目的脚本通通都是放在了package.json的scripts节点下面,当我们要在一个命令执行完后接着去执行下一个命令的时候(如:打包后需要推送打包内容到服务器)就需要增加一条脚本并使用&amp;&amp;进行拼接两条或多条命令来实现,并且符号&amp;在windows下的cmd.exe是不兼容的。 本期介绍的主角(npm-run-all): 今天主要想分享一个比较不错的N
前端小鑫同学
2022/12/26
1.5K0
【分享】并行或串行运行多个NPM脚本的CLI工具
npm并行&串行执行多个scripts命令
通过npm run <commander> 可以运行 package.json 中脚本,Npm 命令不能提供立即运行多个脚本的方式,同时运行需要打开多个终端窗口
奋飛
2020/05/28
6.8K0
npm并行&串行执行多个scripts命令
通过npm run 可以运行 package.json 中脚本,Npm 命令不能提供立即运行多个脚本的方式,同时运行需要打开多个终端窗口
奋飛
2021/08/30
1.6K0
Hadoop: MapReduce2多个job串行处理
复杂的MapReduce处理中,往往需要将复杂的处理过程,分解成多个简单的Job来执行,第1个Job的输出做为第2个Job的输入,相互之间有一定依赖关系。以上一篇中的求平均数为例,可以分解成三个步骤: 1. 求Sum 2. 求Count 3. 计算平均数 每1个步骤看成一个Job,其中Job3必须等待Job1、Job2完成,并将Job1、Job2的输出结果做为输入,下面的代码演示了如何将这3个Job串起来 1 package yjmyzz.mr.job.link; 2 3 import org
菩提树下的杨过
2018/01/19
6860
Spark 多个Stage执行是串行执行的么?
这里的话,我们构建了两个输入(input1,input2),input2带有一个reduceByKey,所以会产生一次Shuffle,接着进行Join,会产生第二次Shuffle(值得注意的是,join 不一定产生新的Stage,我通过强制变更join后的分区数让其发生Shuffle ,然后进行Stage的切分)。
用户2936994
2018/08/27
1.3K0
Spark 多个Stage执行是串行执行的么?
使用 Maven 运行单元测试
Gitlab 除了基本的版本管理功能之外,还提供了很有用的持续集成能力,简单的在项目根目录中编写一段 .gitlab-ci.yml,就能够让 Gitlab 按照其中的指示完成持续集成的工作。
崔秀龙
2019/07/24
1.8K0
js实现多个异步任务的串行和并行执行(add/sum)
参考代码:https://github.com/shfshanyue/Daily-Question/issues/662#issuecomment-885993395
蓓蕾心晴
2022/08/28
1.8K0
一套测试用例如何实现支持多个环境运行
一款需要正式对外发布的产品,通常都需要经历一个较完整的测试验证过程,在整个产品质量验证阶段,一般会经历几类测试环境的验证:从产品集成阶段的测试环境->验收阶段的预发布环境->正式发布回归的生产环境。
测试开发技术
2020/05/13
2.1K0
一套测试用例如何实现支持多个环境运行
使用 Swift 的并发系统并行运行多个任务
Swift 内置并发系统的好处之一是它可以更轻松地并行执行多个异步任务,这反过来又可以使我们显着加快可以分解为单独部分的操作。
Swift社区
2022/05/19
1.2K0
批量运行多个R脚本
如果把这些R代码文件一个个打开,然后一个个运行,工作量也不小,所以我们推荐一个技巧:
生信技能树
2022/07/26
1.9K0
批量运行多个R脚本
linux 下运行多个tomcat
export CATALINA_BASE CATALINA_HOME TOMCAT_HOME
流柯
2018/08/30
4.4K0
RestAssured接口系列|环境搭建
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
测试邦
2019/07/24
5350
利器 | 接口自动化测试框架 RESTAssured 实践(三)对 Response 结果导出
上一篇文章中介绍了rest-assured对返回结果的断言,最后说明了对于Response结果导出的需求。可查看往期文章进行查看。
霍格沃兹测试开发
2022/05/30
4520
如何在 Mac 上使用 pyenv 运行多个版本的 Python
即使对于有经验的开发人员,管理本地 Python 开发环境仍然是一个挑战。尽管有详细的软件包管理策略,但仍需要采取另外的步骤来确保你在需要时运行所需的 Python 版本。
用户8639654
2021/09/18
5.3K0
Scrapy:多个爬虫同时运行
在spiders目录的同级目录下创建一个commands目录,并在该目录中创建一个crawlall.py,将scrapy源代码里的commands文件夹里的crawl.py源码复制过来,只修改run()方法即可。(文件夹下面必须要有__init__文件)
新码农
2020/12/29
1.5K0
【IDEA】同一个应用运行多个测试实例(以不同端口)
一、在idea中写好应用后,正常情况下,选择测试,将启动唯一的服务实例(8080端口默认)
陶然同学
2023/04/02
1.5K0
【IDEA】同一个应用运行多个测试实例(以不同端口)
批量运行多个R脚本并打印运行状态
曾老师曾经有一篇推文《批量运行多个R脚本》,介绍了批量运行R脚本的思路,同时也提出了一些问题,今天就这个学徒作业,我们来探究一下。
小汪Waud
2023/02/20
9360
批量运行多个R脚本并打印运行状态
如何在多个 Linux 服务器上运行多个命令
如果你正在管理多台 Linux 服务器,并且你想在所有 Linux 服务器上运行多个命令,但你不知道该怎么做。不用担心,在这个简单的服务器管理指南[1]中,我们将向您展示如何在多个 Linux 服务器上同时运行多个命令。
数据科学工厂
2023/08/10
3570
如何在多个 Linux 服务器上运行多个命令
tomcat不能运行或共存多个项目
我在Tomcat下部署了两个项目,但是一个可以运行,另一个不可以,第一感觉是内存问题,给tomcat多分配了内存.但是没有作用. 原因是少了webAppRootKey这个参数,需要在各自的web.xml下添加 <context-param>        <param-name>webAppRootKey</param-name>        <param-value>socialmedia</param-value>   </context-param> 但是我添加后,只能运行一个,其他两个运行不了。原
冷冷
2018/02/08
9950
pytest运行_pytest执行多个py文件
pytest 运行完用例之后会生成一个 .pytest_cache 的缓存文件夹,用于记录用例的ids和上一次失败的用例。 方便我们在运行用例的时候加上–lf 和 –ff 参数,快速运行上一次失败的用例。 –lf, –last-failed 只重新运行上次运行失败的用例(或如果没有失败的话会全部跑) –ff, –failed-first 运行所有测试,但首先运行上次运行失败的测试(这可能会重新测试,从而导致重复的fixture setup/teardown)
全栈程序员站长
2022/09/16
2K0

相似问题

不运行Tomcat的RestAssured测试

11

使用Restassured测试后端超时

22

使用restassured测试获取503错误

10

API测试- RestAssured循环

10

使用spring-boot和restassured在teamcity中运行集成测试

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文