V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
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 · 4890 次点击
    这是一个创建于 2754 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大量调用最好线程安全的
    求大神给点思路
    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   ·   实用小工具   ·   2007 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:14 · PVG 00:14 · LAX 08:14 · JFK 11:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.