GCD使用(二)执行与UI无关的操作

来源:互联网 发布:家装网络布线方案 编辑:程序博客网 时间:2024/05/23 15:42

1。并发队列:dispatch_get_global_queue 

      dispatch_queue_t  concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

      参数:优先等级DISPATCH_QUEUE_PRIORITY_LOW , DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_PRIORITY_HIGH

2。 void dispatch_sync(  dispatch_queue_t  queue,  dispatch_block_t block);

      在其所属的队列(queue)中是同步操作,即该队列中后续操作必须要等此代码完成方可进行,但其它队列可并发进行

      虽然是同步操作,但若分属于多个不同队列时,也可以有异步效果

      根据GCD的优化原则,队列(queue)也有可能是在主线程中运行


e.g. 1  图像下载

    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

   dispatch_async(concurrentQueue, ^{   

        __block UIImage *image = nil;

        /* Download the image here  此操作不会阻塞主线程 ,因为它是在concurrentQueue队列中操作 */

       dispatch_sync(concurrentQueue, ^{

            //折行用  \

            NSString *urlAsString =

            @"http://images.apple.com/mobileme/features"\

            "/images/ipad_findyouripad_20100518.jpg";

            

            NSURL *url = [NSURL URLWithString:urlAsString];       

            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];

                /* We have the image. We can use it now */               

            }

            else if (downloadError != nil){

                NSLog(@"Error happened = %@", downloadError);

            } else {

                NSLog(@"No data could get downloaded from the URL.");

            }

            

        });

         //同步操作 ,但分属于不同队列(主线程中)

       dispatch_sync(dispatch_get_main_queue(), ^{

            /* Show the image to the user here on the main queue*/          

            if (image != nil){

                UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];

                [imageView setImage:image];

                [imageView setContentMode:UIViewContentModeScaleAspectFit];

                [self.view addSubview:imageView];            

            } else {

                NSLog(@"Image isn't downloaded. Nothing to display.");

            }

            

        });

        

    }); 


e.g. 2 文件示例

- (NSString *) fileLocation{

    NSArray *folders = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, YES);

    if ([folders count] == 0){

        return nil;

    }

    NSString *documentsFolder = folders[0];

    return [documentsFolder   stringByAppendingPathComponent:@"list.txt"]; 

}

- (BOOL) hasFileAlreadyBeenCreated{

    BOOL result = NO; 

    NSFileManager *fileManager = [[NSFileManager alloc] init];

    if ([fileManager fileExistsAtPath:[self fileLocation]]){

        result = YES;

    }

    return result;

}

- (void) viewDidAppear:(BOOL)paramAnimated{    

    [super viewDidAppear:paramAnimated]; 

    dispatch_queue_t concurrentQueue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

   dispatch_async(concurrentQueue, ^{     

        NSUInteger numberOfValuesRequired = 10000;      

        if ([self hasFileAlreadyBeenCreated] == NO){

            //同步,创建文件 (因不在主线程中操作,不会阻塞主线程)

           dispatch_sync(concurrentQueue, ^{              

                NSMutableArray *arrayOfRandomNumbers = [[NSMutableArray alloc] initWithCapacity:numberOfValuesRequired];

                NSUInteger counter = 0;

                for (counter = 0;  counter < numberOfValuesRequired;  counter++){

                    unsigned int randomNumber =  arc4random() % ((unsigned int)RAND_MAX + 1);                  

                    [arrayOfRandomNumbers addObject: [NSNumber numberWithUnsignedInt:randomNumber]];

                }

                [arrayOfRandomNumbers writeToFile:[self fileLocation] atomically:YES];                

            });

        }

        

        __block NSMutableArray *randomNumbers = nil;

        

        //同步,读出文件, 排序 (因不在主线程中操作,不会阻塞主线程)

       dispatch_sync(concurrentQueue, ^{

            if ([self hasFileAlreadyBeenCreated]){

                randomNumbers = [[NSMutableArray alloc]  initWithContentsOfFile:[self fileLocation]];

                [randomNumbers sortUsingComparator:  ^NSComparisonResult(id obj1, id obj2) {                    

                     NSNumber *number1 = (NSNumber *)obj1;

                     NSNumber *number2 = (NSNumber *)obj2;

                     return [number1 compare:number2];                  

                 }];

            }

        });

        

        //异步,在主线程中

        dispatch_async(dispatch_get_main_queue(), ^{

            if ([randomNumbers count] > 0){

                NSLog(@"result:%@",randomNumbers);

                /* Refresh the UI here using the numbers in the

                 randomNumbers array */

            }

        });

        

    });   

}

postscript:

       arc4random():随机,不需要种子,返回的最大值0x100000000(4294967296) 

   RAND_MAX:随机,返回的最大值0x7fffffff(2147483647) 

   int value = arc4random() % x; //0 到x-1之间的整数


0 0
原创粉丝点击