• 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];
        });
    });
  • 相关阅读:
    nginx错误收集
    RDP-报表
    畅谈一二三
    基于vue项目,如何构建组织可维护前端路由结构
    Grid 布局基础常见场景
    数组中every、some、from、reduce四个很重要的api用法总结
    当代免疫学小史-第三章
    当代免疫学小史-第二章
    微信小程序swiper实现 句子控app首页滑动卡片
    微信小程序 setData的小知识
  • 原文地址:https://www.cnblogs.com/yingkong1987/p/3313504.html
Copyright © 2020-2023  润新知