[求教] iOS 有时间间隔的队列 怎么实现性能最好? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
a href="http://nshipster.cn/" target="_blank">http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
niselover
V2EX    iDev

[求教] iOS 有时间间隔的队列 怎么实现性能最好?

  •  
  •   niselover 2017-05-10 00:31:49 +08:00 5239 次点击
    这是一个创建于 3126 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大量调用最好线程安全的
    求大神给点思路
    11 条回复    2017-05-12 11:21:26 +08:00
    NUT
        1
    NUT  
       2017-05-10 09:04:37 +08:00
    什么叫做时间间隔? 定时去调用吗?还是一个执行完阻塞到下一个开始执行?

    OC 有两种实现队列的方法,
    1.GCD 的线程队列 queue
    2.NSOperationQueue

    queue 所执行的 task,都是线程安全的, 所以你要处理所执行变量的线程安全。


    如果是这样 我觉得你可以用 gcd queue 中 sync 的那种方法来做。
    niselover
        2
    niselover  
    OP
       2017-05-10 11:51:29 +08:00
    @NUT 执行完阻塞到下一个开始执行这种情况
    你指的是 gcd 的 子线程同步串行队列 是吧?
    NUT
        3
    NUT  
       2017-05-10 14:26:47 +08:00
    @niselover 你的情况,这两个都可以实现。 用 NSOperationQueue 时候需要设置最大的并发是 1,同时需要保证,NSOperation 的 start 或者 run 方法 里面代码块是 同步执行吗,否则会出现回调无法着陆的问题。NSOperationQueue 是 GCD 的封装可以进行某一个异步任务的取消,GCD 就无能为力了。 有机会可以看看 AFNetworking 在 1.*版本的实现。
    qinbingchen
        4
    qinbingchen  
       2017-05-10 23:42:13 +08:00
    问题描述不清楚啊 有时间间隔的....
    xi_lin
        5
    xi_lin  
       2017-05-11 13:44:53 +08:00
    下一个开始执行的调度机制是啥?
    NUT
        6
    NUT  
       2017-05-11 17:18:32 +08:00
    @xi_lin #5 串行队列,GCD queue 自己调度, 或者自己写一个生产消费模型, 原理可以参考下 JAVA 的 BlockingQueue
    xi_lin
        7
    xi_lin  
       2017-05-11 18:30:26 +08:00
    @NUT 串行队列或者 BlockingQueue 我没问题,我是不理解 LZ 问题里的时间间隔,说是执行完要阻塞队列到下一个开始执行。这个开始执行的时机不知道是怎么来确定的。
    NUT
        8
    NUT  
       2017-05-11 18:32:33 +08:00
    那你问问楼主。 或者说何必那么纠结呢。
    niselover
        9
    niselover  
    OP
       2017-05-11 23:43:11 +08:00
    @qinbingchen
    @xi_lin
    @NUT
    不好意思 没描述清楚
    需求是这样的 服务器返回数据 调用方法 执行动画
    但是如果返回数据并发太高 上个动画还没执行完下个动画就执行 偶尔会出问题
    所以需要在服务器返回数据时加入一个队列 然后间隔一定时间 再执行
    请教各位有啥好的方案么
    acumen
        10
    acumen  
       2017-05-12 08:59:16 +08:00
    @niselover 网络请求成功回调的时候才执行动画?
    你可以是试试用 DispatchGroup,在网络请求的开始 group.enter() 在动画结束的 closure 里 gourd_leave()。

    以上方法没有检验过。这个应用场景类似几个有依赖的网络请求操作啊
    xi_lin
        11
    xi_lin  
       2017-05-12 11:21:26 +08:00
    @niselover 我整理一下你的需求
    1. 从服务器返回数据 R1,R2,R3,返回数据的时机不一定
    2. 按返回数据的顺序执行动画
    3. 有数据才执行动画,没数据就啥也不做
    4. 动画之间需要有时间间隔

    如果是这个需求,不如在动画结束和数据到达的时候自己手动调度一下
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     821 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 22:17 PVG 06:17 LAX 14:17 JFK 17:17
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86