首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从用于循环的服务器中获取数据的iOS

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

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

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

代码语言:javascript
代码运行次数:0
运行
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
代码运行次数:0
运行
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
代码运行次数:0
运行
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
代码运行次数:0
运行
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

复制
相关文章
从损坏的手机中获取数据
有时候,犯罪分子会故意损坏手机来破坏数据。比如粉碎、射击手机或是直接扔进水里,但取证专家仍然可以找到手机里的证据。
FB客服
2020/02/23
10.3K0
PHP无限循环获取MySQL中的数据实例代码
最近公司有个需求需要从MySQL获取数据,然后在页面上无线循环的翻页展示。主要就是一直点击一个按钮,然后数据从最开始循环到末尾,如果末尾的数据不够了,那么从数据的最开始取几条补充上来。   其实,这个功能可以通过JQ实现,也可以通过PHP + MYSQL实现,只不过JQ比较方便而且效率更高罢了。   每次显示10条数据。
用户2323866
2021/07/01
3.5K0
iOS 中获取某个视图的截图
最近在做SDK的截图,想触发类似系统的截屏功能,找了一圈,总结一下靠谱的几种方式。 我写了个UIView 的category,将这几种方式封装和简化了一下。
Haley_Wong
2018/08/22
3K0
iOS 获取gif图片循环次数和时长
//获取gif图片的总时长和循环次数 - (NSTimeInterval)durationForGifData:(NSData *)data{ //将GIF图片转换成对应的图片源 CGImageSourceRef gifSource = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL); //获取其中图片源个数,即由多少帧图片组成 size_t frameCout = CGImageSourceGetCo
且行且珍惜_iOS
2018/05/22
3.7K1
iOS-从循环引用看Block
说明:在block区内已经释放,到self.block()调用时已经被释放,所以值为null。
Wilbur-L
2020/12/15
1.2K0
iOS-从循环引用看Block
通过 HttpClient 从指定服务器获取数据
第一步:在POM.xml中添加dependency <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <
week
2018/08/27
2.1K0
逆向从 Instruments 中获取 GPU 数据
背景: RTMP SDK需要获取硬编硬解时候的GPU数据,第一时间想起了TraceParser, 但是TraceParser不支持GPU Driver模板. 于是想着能不能扩展TraceParser模板. 发现main.m文件只有寥寥几行代码,完全不知道做了什么, 但是google和km之后发现应该是采用了反序列化的方式来dump出数据. 缺点很明显, 需要自己实现NSCoding,还需要先将.trace文件解压出.run文件. 不知道结构无从下手.
Locker
2018/08/01
5.9K0
逆向从 Instruments 中获取 GPU 数据
从Bitmap中获取YUV数据的两种方式
从Bitmap中我们能获取到的是RGB颜色分量,当需要获取YUV数据的时候,则需要先提取R,G,B分量的值,然后将RGB转化为YUV(根据具体的YUV的排列格式做相应的Y,U,V分量的排列)
雪月清
2020/06/23
4.7K0
IOS中获取各种文件的目录路径的方法
iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么.
用户7705674
2021/10/29
6K0
CaseStudy(showcase)数据篇-从XML中获取数据
做silvelight也有一段时间了,相册、游戏,刚刚完成的showcase这个小程序算是一个阶段了。这里就以showcase这个项目来做一下CaseStudy。 数据篇-从XML中获取数据 这个项目
用户1172164
2018/01/16
4.5K0
iOS性能数据获取-tidevice
Git地址:https://github.com/alibaba/taobao-iphone-device 安装:pip install -U tidevice
沈宥
2022/06/21
6090
iOS性能数据获取-tidevice
iOS中获取要要保存到相册中的图片
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/53412588
用户1451823
2018/09/13
1.4K0
一次深刻的学习之旅:Power Query中真有循环吗?从获取GUID说起
也就是说,“得益于”pq强大的引擎,Text.NewGuid()只运行了一次,的确非常节省算力。
陈学谦
2021/12/15
1.3K0
一次深刻的学习之旅:Power Query中真有循环吗?从获取GUID说起
iOS - 关于NSTimer的循环引用
现象 在当前控制器(ViewController)的view上添加了一个自定义的view(LXFTimerView), LXFTimerView在成功创建出来后添加了定时器NSTimer并加入Run
LinXunFeng
2018/06/29
1.1K0
iOS:获取 NSDate 的年
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/109930.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/05
4180
iOS开发中利用block解决NSTimer的循环引用问题
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/80313441
用户1451823
2018/09/13
8410
iOS开发中利用block解决NSTimer的循环引用问题
从LoRaWAN服务器thethingsnetwork.org获取应用数据
多数情况下只需要关注上报和下发数据,因此本文主要说明如何使用MQTT方式获取数据和下发数据,官方说明https://www.thethingsnetwork.org/docs/applications/mqtt/api.html。
ManInRoad
2020/09/27
1.4K0
从LoRaWAN服务器thethingsnetwork.org获取应用数据
从iOS 11 UI Kit中谈谈iOS 11的新变化
北京时间9月20日凌晨1点,iOS 11终于迎来了正式版的推送,相信各位小伙伴已经在第一时间进行了升级。iOS 11毫无疑问是一次大规模的系统更新,UI、系统内核、锁屏等多方面都进行了不同程度的改进。小编第一时间为大家整理好了iOS 11优秀 UI Kit的下载资源,并且与大家谈一谈UI Kit背后的iOS 11的新变化。 1、 iOS 11 UI 的新变化 在准备着手设计前,首先我们来梳理一下iOS 11 的设计理念。在iOS系统的长期发展中,随着功能和界面的不断丰富,整个系统日趋复杂,App内部
奔跑的小鹿
2018/03/16
1.1K0
从iOS 11 UI Kit中谈谈iOS 11的新变化
ios 获取属性的类型
如何在运行的时候动态获取到该属性的类型呢? 此方法获取属性的特性:property_copyAttributeValue unsigned int a; objc_property_t * result = class_copyPropertyList(object_getClass(k), &a); for (unsigned int i = 0; i < a; i++) { objc_property_t o_t = result[i]; NSLog(@"name:
onety码生
2018/11/21
2.8K0
volley7–NetworkDispatcher从网络中获取数据[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/108121.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/20
3K0

相似问题

从服务器获取数据的iOS

11

用于从XML获取数据的javascript循环

20

在iOS中从服务器获取数据

27

Flutter用于循环从api获取数据

278

while循环中的while循环,用于从数据库获取数据

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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