线程的理解一

-、NSOperation

复制代码
 1 - (void)demoAboutNSOperation
 2 {
 3    NSOperation * block =  [NSBlockOperation blockOperationWithBlock:^{
 4         NSLog(@"block %@",[NSThread currentThread]);
 5     }];
 6     
 7     [self.queue addOperation:block];
 8     
 9     [self.queue addOperationWithBlock:^{
10         NSLog(@"耗时操作 %@",[NSThread currentThread]);
11         [[NSOperationQueue mainQueue] addOperationWithBlock:^{
12             NSLog(@" mainQueue %@",[NSThread currentThread]);
13         }];
14     }];
15     
16     
17 }

 二  gcd

 - (void)dispatchDemo
 2 {
 3     NSLog(@" start %@",[NSThread currentThread]);
 4     
 5     dispatch_async(dispatch_get_global_queue(0, 0), ^{
 6         NSLog(@" 耗时从左 %@",[NSThread currentThread]);
 7         
 8         dispatch_sync(dispatch_get_main_queue(), ^{
 9             NSLog(@" 回到主线程 %@", [NSThread currentThread]);
10         });
11         
12     });
13     
14     NSLog(@"end %@",[NSThread currentThread]);
15 }


复制代码
 //  后台执行:
 dispatch_async(dispatch_get_global_queue(0, 0), ^{
      // something
 });
// 主线程执行: dispatch_async(dispatch_get_main_queue(), ^{ // something });
// 一次性执行: static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ // code to be executed once });
// 延迟2秒执行: double delayInSeconds = 2.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ // code to be executed on the main queue after delay });
// 自定义dispatch_queue_t dispatch_queue_t urls_queue = dispatch_queue_create("blog.devtang.com", NULL); dispatch_async(urls_queue, ^{    // your code }); dispatch_release(urls_queue);
// 合并汇总结果 dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{ // 并行执行的线程一 }); dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{ // 并行执行的线程二 }); dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{ // 汇总结果 });

 

GCD的另一个用处是可以让程序在后台较长久的运行。

在没有使用GCD时,当app被按home键退出后,app仅有最多5秒钟的时候做一些保存或清理资源的工作。但是在使用GCD后,app最多有10分钟的时间在后台长久运行。这个时间可以用来做清理本地缓存,发送统计数据等工作。

让程序在后台长久运行的示例代码如下:

复制代码
// AppDelegate.h文件
@property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundUpdateTask;

// AppDelegate.m文件
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [self beingBackgroundUpdateTask];
    // 在这里加上你需要长久运行的代码
    [self endBackgroundUpdateTask];
}

- (void)beingBackgroundUpdateTask
{
    self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [self endBackgroundUpdateTask];
    }];
}

- (void)endBackgroundUpdateTask
{
    [[UIApplication sharedApplication] endBackgroundTask: self.backgroundUpdateTask];
    self.backgroundUpdateTask = UIBackgroundTaskInvalid;
}

 

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL * url = [NSURL URLWithString:@"http://www.baidu.com"];
        NSError * error;
        NSString * data = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
        if (data != nil) {
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"call back, the data is: %@", data);
            });
        } else {
            NSLog(@"error when download:%@", error);
        }
    });
posted @ 2016-05-16 20:18  tiankongzhicheng  阅读(165)  评论(0编辑  收藏  举报