美文网首页iOS开发
iOS开发 - GCD关闭后台子线程?

iOS开发 - GCD关闭后台子线程?

作者: 阿唯不知道 | 来源:发表于2017-10-16 15:44 被阅读17次

    iOS的GCD中如何关闭或者杀死一个还没执行完的后台线程?

    本文主要是做一个笔记,感觉回答得非常👍,转自知乎的一个问答
    iOS的GCD中如何关闭或者杀死一个还没执行完的后台线程?

    知乎刘西浦解答 :

    GCD本身是没有提供这样的API的。想要实现这样的功能需要自己在代码里实现:

    @interface Canceller {
    BOOL _shouldCancel;
        }
    - (void)setShouldCancel:(BOOL)shouldCancel;
    - (BOOL)shouldCancel;
    @end
    
    @implementation Canceller
    - (void)setShouldCancel:(BOOL)shouldCancel {
        _shouldCancel = shouldCancel;
    }
    - (BOOL)shouldCancel {
        return _shouldCancel;
    }
    @end
    
    static void test(int a){
        static Canceller * canceller = nil;
    
        if(q){
            [canceller setShouldCancel:YES];
            [canceller release];
            dispatch_suspend(q);
            dispatch_release(q);
            q=nil;
        }
        canceller = [[Canceller alloc] init];
        q=dispatch_get_global_queue(0,0);
        dispatch_async(q,^ {
            while(![canceller shouldCancel]){NSLog(@"query %d",a);sleep(2);}
        });
    }
    
    
    发布于 2014-05-27  
    
    知乎Allen 赞同了该回答

    嘿嘿嘿,去360面试被随口问了这么一个问题,貌似对他们来讲这是一个灰常简单的问题。我不会,面试官最后反问我:“如果我写一个return会怎样?”卧槽我就恍然大悟!return根执行到代码最后一样并没有什么区别。今天试验了一下,可行。比如这样:

    BOOL gcdFlag = NO;
    
    - (void)viewDidLoad {
    
        [super viewDidLoad];
    
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
          for (long i=0; i<100000; i++) {
               NSLog(@"i:%ld",i);
               sleep(1);
               if (gcdFlag==YES) {
                 NSLog(@"收到gcd停止信号");
                return ;
             }
         };
            });
    
    
        dispatch_after(
        dispatch_time(DISPATCH_TIME_NOW,(int64_t)(15 * NSEC_PER_SEC)),
        dispatch_get_main_queue(), ^{
            NSLog(@"gcd停止信号发出!");
            gcdFlag = YES;
        });
    }
    

    相关文章

      网友评论

        本文标题:iOS开发 - GCD关闭后台子线程?

        本文链接:https://www.haomeiwen.com/subject/krakuxtx.html