dispatch_async 和dispatch_sync

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(10, 10, 100, 100);
    button.backgroundColor = [UIColor brownColor];
    [self.view addSubview:button];
    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(concurrentQueue, ^{
        NSLog(@"111111111111111 %@",[NSThread currentThread]);
        __block UIImage *image = nil;
        dispatch_sync(concurrentQueue, ^{  //@1dispatch_sync
            NSLog(@"22222222222222 %@",[NSThread currentThread]);
            //download image
            NSString *urlString = @"http://images.apple.com/v/macbook-pro/f/images/loupe.png";
            NSURL *url = [NSURL URLWithString:urlString];
            NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
            NSError *downloadError = nil;
            NSData *imageData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:&downloadError];
            if (downloadError == nil && imageData != nil) {
                image = [UIImage imageWithData:imageData];
            }else if(downloadError != nil){
                NSLog(@"Error Happened = %@",downloadError);
            }else{
                NSLog(@"No data could get download from URL.");
            }
        });
        dispatch_sync(concurrentQueue, ^{   //@2//dispatch_sync
            //show image here
            NSLog(@"33333333333 %@",[NSThread currentThread]);
            if (image != nil) {
                UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
                [imageView setImage:image];
               // [imageView setContentMode:UIViewContentModeScaleAspectFill];
                [self.view addSubview:imageView];
            }else{
                NSLog(@"Image isn't downloaded. Nothing to display.");
            }
        });
    });
}
@end

输出如下:

2015-03-31 15:13:59.848 iOSCookbook 7.7[21442:599814] 111111111111111 <NSThread: 0x7ff57ae02480>{number = 2, name = (null)}
2015-03-31 15:13:59.851 iOSCookbook 7.7[21442:599814] 22222222222222 <NSThread: 0x7ff57ae02480>{number = 2, name = (null)}
2015-03-31 15:13:59.992 iOSCookbook 7.7[21442:599814] 33333333333 <NSThread: 0x7ff57ae02480>{number = 2, name = (null)}


第二种测试:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(10, 10, 100, 100);
    button.backgroundColor = [UIColor brownColor];
    [self.view addSubview:button];
    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(concurrentQueue, ^{
        NSLog(@"111111111111111 %@",[NSThread currentThread]);
        __block UIImage *image = nil;
        dispatch_async(concurrentQueue, ^{  //@1dispatch_async
            NSLog(@"22222222222222 %@",[NSThread currentThread]);
            //download image
            NSString *urlString = @"http://images.apple.com/v/macbook-pro/f/images/loupe.png";
            NSURL *url = [NSURL URLWithString:urlString];
            NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
            NSError *downloadError = nil;
            NSData *imageData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:&downloadError];
            if (downloadError == nil && imageData != nil) {
                image = [UIImage imageWithData:imageData];
            }else if(downloadError != nil){
                NSLog(@"Error Happened = %@",downloadError);
            }else{
                NSLog(@"No data could get download from URL.");
            }
        });
        dispatch_sync(concurrentQueue, ^{   //@2//dispatch_sync
            //show image here
            NSLog(@"33333333333 %@",[NSThread currentThread]);
            if (image != nil) {
                UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
                [imageView setImage:image];
               // [imageView setContentMode:UIViewContentModeScaleAspectFill];
                [self.view addSubview:imageView];
            }else{
                NSLog(@"Image isn't downloaded. Nothing to display.");
            }
        });
    });
}
@end



将1@处改为dispatch_async

输出如下:

2015-03-31 15:16:13.143 iOSCookbook 7.7[21471:600996] 111111111111111 <NSThread: 0x7f8769f01670>{number = 2, name = (null)}
2015-03-31 15:16:13.145 iOSCookbook 7.7[21471:600996] 33333333333 <NSThread: 0x7f8769f01670>{number = 2, name = (null)}
2015-03-31 15:16:13.145 iOSCookbook 7.7[21471:600996] Image isn't downloaded. Nothing to display.
2015-03-31 15:16:13.145 iOSCookbook 7.7[21471:600997] 22222222222222 <NSThread: 0x7f8769e29ee0>{number = 3, name = (null)}

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(10, 10, 100, 100);
    button.backgroundColor = [UIColor brownColor];
    [self.view addSubview:button];
    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(concurrentQueue, ^{
        NSLog(@"111111111111111 %@",[NSThread currentThread]);
        __block UIImage *image = nil;
        dispatch_sync(concurrentQueue, ^{  //@1dispatch_sync
            NSLog(@"22222222222222 %@",[NSThread currentThread]);
            //download image
            NSString *urlString = @"http://images.apple.com/v/macbook-pro/f/images/loupe.png";
            NSURL *url = [NSURL URLWithString:urlString];
            NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
            NSError *downloadError = nil;
            NSData *imageData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:&downloadError];
            if (downloadError == nil && imageData != nil) {
                image = [UIImage imageWithData:imageData];
            }else if(downloadError != nil){
                NSLog(@"Error Happened = %@",downloadError);
            }else{
                NSLog(@"No data could get download from URL.");
            }
        });
        dispatch_sync(dispatch_get_main_queue(), ^{   //@2//dispatch_sync
         // dispatch_get_main_queue() 
         //show image here
            NSLog(@"33333333333 %@",[NSThread currentThread]);
            if (image != nil) {
                UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
                [imageView setImage:image];
               // [imageView setContentMode:UIViewContentModeScaleAspectFill];
                [self.view addSubview:imageView];
            }else{
                NSLog(@"Image isn't downloaded. Nothing to display.");
            }
        });
    });
}
@end

不知道为什么使用dispatch_get_main_queue() 比concurrentQueue要快很多!


一般的使用原则如下:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // 耗时的操作
    dispatch_async(dispatch_get_main_queue(), ^{
        // 更新界面
    });
});



你可能感兴趣的:(dispatch_async 和dispatch_sync)