GCD和信号量

GCD

概念不多说,直接上代码。话说也不是什么高深的东东,不过极大简化了代码,一目了然。后面对信号量的记录也采用了相同的原理。

//抛出线程

dispatch_async(dispatch_get_global_queue(0, 0), ^{



    NSURL * url = [NSURL URLWithString:@"http://www.google.com"];

    NSString * data = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

    if (data != nil) {

        //抛出的线程执行完后,回到主线程处理界面逻辑。

        dispatch_async(dispatch_get_main_queue(), ^{



        });

    } else {



    }

});

semaphore(信号量)

信号量主要是用在传说中的生产者消费者模式里面,当信号量为0时线程挂起,当信号量大于0时继续向下执行。以前研究过一次,不过没怎么搞懂,反而把界面给搞死了。这次,取相册里的图片,GCD加Semaphore,又折腾了一次,还好。不多说,继续上代码。

//这几段代码的大概意思是:抛一个线程出来,取相册里的group,再在取group中的线程中抛出线程,去取group中的result,最终到界面线程中去操作。

//这里需要两个信号量,一个用来阻塞取group的线程,避免界面线程先于取group的线程运行完毕。另外一个用来阻塞取result中的线程,避免取result的

//线程先于取group执行完毕。



//抛出线程

dispatch_async(dispatch_get_global_queue(0, 0), ^{



    //创建信号量

    dispatch_semaphore_t semaphore1 = dispatch_semaphore_create(0);

    dispatch_semaphore_t semaphore2 = dispatch_semaphore_create(0);

    ALAssetsGroupEnumerationResultsBlock groupEnumerAtion = ^(ALAsset *result, NSUInteger index, BOOL *stop){



        if (result == nil) {

            //当某个group取完毕后,信号量加1,dispatch_semaphore_wait方法执行,信号量为0,程序循环,去取下一个group中的result

            dispatch_semaphore_signal(semaphore2);



        }else if ([[result valueForProperty:ALAssetPropertyType]isEqualToString:ALAssetTypePhoto]||[[result valueForProperty:ALAssetPropertyType]

 isEqualToString:ALAssetTypeVideo]) {



            FileNode *node = [[FileNode alloc] init];

            node.m_name =  result.defaultRepresentation.filename;

            node.m_path = [result.defaultRepresentation.url absoluteString];

            [self.picList addObject:node];

            NSLog(@"%@",node.m_name);

            NSLog(@"%@",node.m_path);

            [node release];



        }

    };





    ALAssetsLibraryGroupsEnumerationResultsBlock libraryGroupsEnumeration = ^(ALAssetsGroup* group, BOOL* stop){



        if (group!=nil)

        {



            [group enumerateAssetsUsingBlock:groupEnumerAtion];

            dispatch_semaphore_wait(semaphore2, DISPATCH_TIME_FOREVER);



        }else{

            //当所有group取完后,信号量加1,程序不再阻塞,进入界面线程。

            dispatch_semaphore_signal(semaphore1);

        }



    };



    ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *error){





        NSLog(@"failureblock:%@",error);

    };





    ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init];

    [library enumerateGroupsWithTypes:ALAssetsGroupAll

                           usingBlock:libraryGroupsEnumeration

                         failureBlock:failureblock];



    dispatch_semaphore_wait(semaphore1, DISPATCH_TIME_FOREVER);

    dispatch_release(semaphore1);

    dispatch_release(semaphore2);

    dispatch_async(dispatch_get_main_queue(), ^{



        [self loadPicAtPage:self.currentPage];

        [self loadPicAtPage:self.currentPage + 1];

    });

});

你可能感兴趣的:(信号量)