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
C90
V2EX  ›  iDev

NSOperation 和 GCD 都不能结束当前的耗时操作吗?

  •  
  •   C90 · 2017-06-28 17:00:40 +08:00 · 4620 次点击
    这是一个创建于 2712 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如果不是,该如何去结束正在进行还没有完成的任务?

    26 条回复    2017-09-16 23:00:55 +08:00
    chipmuck
        1
    chipmuck  
       2017-06-28 17:14:07 +08:00
    NSOperation cancel

    or

    NSOperationQueue cancelAllOperations
    C90
        2
    C90  
    OP
       2017-06-28 17:19:15 +08:00
    @chipmuck 这两个方法只能取消之后的任务,并不能结束当前的任务
    C90
        3
    C90  
    OP
       2017-06-28 17:40:17 +08:00
    @chipmuck 也许是我的姿势不对
    paradoxs
        4
    paradoxs  
       2017-06-28 17:43:01 +08:00
    正在执行的任务无法取消, 你可以在任务内做一个 isStop 之类的标记..
    chipmuck
        5
    chipmuck  
       2017-06-28 17:47:25 +08:00
    @C90

    代码怎么贴。。。
    C90
        6
    C90  
    OP
       2017-06-28 17:47:30 +08:00
    @paradoxs 我引用的是静态库里函数,没办法修改源码...
    C90
        7
    C90  
    OP
       2017-06-28 17:48:06 +08:00
    @chipmuck 我也不知道 - -
    xx314327475
        8
    xx314327475  
       2017-06-28 17:52:40 +08:00
    @C90 GCD 不可以 NSOperation 可以,具体看一楼
    chipmuck
        10
    chipmuck  
       2017-06-28 17:57:29 +08:00
    @C90 任务如果有多行,那么可以在里面插入 flag 判断,在外部调用返回的 block 就可以实现取消了。
    C90
        11
    C90  
    OP
       2017-06-28 17:58:09 +08:00
    @xx314327475 没有解决
    C90
        12
    C90  
    OP
       2017-06-28 17:58:33 +08:00
    @chipmuck 只有一行代码,耗时数秒
    C90
        13
    C90  
    OP
       2017-06-28 17:59:40 +08:00
    @chipmuck 调用的是静态库里的函数,不修改源码的前提下有没有好的办法?
    chipmuck
        14
    chipmuck  
       2017-06-28 18:00:32 +08:00
    @C90 不涉及 UI 的话就放其他线程跑吧。
    C90
        15
    C90  
    OP
       2017-06-28 18:05:12 +08:00
    @chipmuck 放到了子 thread,但是没法停止
    paradoxs
        16
    paradoxs  
       2017-06-28 18:07:53 +08:00
    zqqf16
        17
    zqqf16  
       2017-06-28 18:13:56 +08:00
    可以试试类似 pthread_cancel 的方法,不知道会不会对 GCD 管理的线程池有影响~
    C90
        18
    C90  
    OP
       2017-06-28 18:41:54 +08:00
    @paradoxs 不太明白
    C90
        19
    C90  
    OP
       2017-06-28 18:46:17 +08:00
    @zqqf16 这个方法可以
    paradoxs
        20
    paradoxs  
       2017-06-28 19:44:00 +08:00
    @C90 你要停止静态库里面的方法是吗.
    C90
        21
    C90  
    OP
       2017-06-28 19:45:51 +08:00
    paradoxs
        22
    paradoxs  
       2017-06-28 19:47:27 +08:00
    @C90 不行的吧.
    a412739861
        23
    a412739861  
       2017-06-28 20:08:07 +08:00
    耗时不应该是扔到后台线程操作么?

    NSOperation 自带的 cancel,但是似乎也只是个标记。如果是自己实现的 NSOperation,也就是执行过程中,检查 cancel 标记,如果有,则不执行,任务已经执行好像都没用了,顶多不处理后续结果。
    GCD 你拿一个变量做标记也没问题吧。
    以上都是执行前判断似乎。
    C90
        24
    C90  
    OP
       2017-06-28 20:58:25 +08:00
    @a412739861 我调的是静态库的一个函数,没有立 flag 的机会,你说的这个不能解决,最后是用 17 楼的方法解决的
    DingSoung
        25
    DingSoung  
       2017-06-30 10:59:14 +08:00
    停不了,除非你线程挂掉
    NUT
        26
    NUT  
       2017-09-16 23:00:55 +08:00
    OP 的话 可以设置 Status 的状态,这个参考下 af1.x 的 代码。GCD 是没有停止的接口。 所以要保证操作的幂等性。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   955 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:53 · PVG 06:53 · LAX 14:53 · JFK 17:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.