第25月第26天dispatch_group(代码片段)

javastart javastart     2023-01-12     690

关键词:

1.

dispatch_group_enter(group);

dispatch_group_leave(group);

 dispatch_group_notify(group1, queue1,block);

在这种组合下,根据任务是同步、异步又分为两种,这两种组合的执行代码与运行结果如下:

第一种:同步任务时

技术分享图片
 dispatch_queue_t queue2 = dispatch_queue_create("dispatchGroupMethod2.queue2", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_t group2 = dispatch_group_create();
    

    dispatch_group_enter(group2);
    dispatch_sync(queue2, ^
        for (NSInteger i =0; i<3; i++) 
            sleep(1);
            NSLog(@"%@-同步任务执行-:%ld",@"任务1",(long)i);
            
        
        dispatch_group_leave(group2);
    );
    

    
    dispatch_group_enter(group2);
    dispatch_sync(queue2, ^
        for (NSInteger i =0; i<3; i++) 
            sleep(1);
            NSLog(@"%@-同步任务执行-:%ld",@"任务2",(long)i);
            
        
        dispatch_group_leave(group2);
    );
    
//    //等待上面的任务全部完成后,会往下继续执行 (会阻塞当前线程)
//    dispatch_group_wait(group2, DISPATCH_TIME_FOREVER);
    
    //等待上面的任务全部完成后,会收到通知执行block中的代码 (不会阻塞线程)
    dispatch_group_notify(group2, queue2, ^
        NSLog(@"Method2-全部任务执行完成");
    );
技术分享图片

同步任务执行结果:

第二种:异步任务时

技术分享图片
   dispatch_queue_t queue2 = dispatch_queue_create("dispatchGroupMethod2.queue2", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_t group2 = dispatch_group_create();
    

    dispatch_group_enter(group2);
    dispatch_async(queue2, ^
        for (NSInteger i =0; i<3; i++) 
            sleep(1);
            NSLog(@"%@-异步任务执行-:%ld",@"任务1",(long)i);
            
        
        dispatch_group_leave(group2);
    );
    

    
    dispatch_group_enter(group2);
    dispatch_async(queue2, ^
        for (NSInteger i =0; i<3; i++) 
            sleep(1);
            NSLog(@"%@-异步任务执行-:%ld",@"任务2",(long)i);
            
        
        dispatch_group_leave(group2);
    );
    
//    //等待上面的任务全部完成后,会往下继续执行 (会阻塞当前线程)
//    dispatch_group_wait(group2, DISPATCH_TIME_FOREVER);
    
    //等待上面的任务全部完成后,会收到通知执行block中的代码 (不会阻塞线程)
    dispatch_group_notify(group2, queue2, ^
        NSLog(@"Method2-全部任务执行完成");
    );
技术分享图片

异步任务执行结果:

 

https://www.cnblogs.com/zhou--fei/p/6747938.html

 

2.

 

创建一个信号量,作为全局变量。
并初始化,信号量为0

dispatch_semaphore_t semaphore;
semaphore = dispatch_semaphore_create(0);

创建一个dispatch_group_t,开启两个组异步线程(dispatch_group_async),分别执行两个网络请求。
一个组通知线程(dispatch_group_notify),用于接收前面两个线程的结果。

dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_async(group, queue, ^
        [weakSelf loadRelationDetail];//请求1
    );
    dispatch_group_async(group, queue, ^
        [weakSelf loadRelationReward];//请求2
    );
    dispatch_group_notify(group, queue, ^
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        //合并(此处是数据处理,你可根据具体业务需求进行处理)
        NSMutableArray *arr = [NSMutableArray array];
        [arr addObjectsFromArray:weakSelf.arr1];
        [arr addObjectsFromArray:weakSelf.arr2];
        //排序
        if (arr.count > 1) 
            weakSelf.sumArr = [arr sortedArrayUsingComparator:^NSComparisonResult(ZHShareItem *obj1, ZHShareItem *obj2) 
                return [obj1.createTime compare:obj2.createTime];
            ];
        else
            weakSelf.sumArr = arr;
        
        //有数据刷新
        if (weakSelf.sumArr.count > 0) 
            //在主线程刷新页面
            dispatch_async(dispatch_get_main_queue(), ^
                [weakSelf initTableView];
            );
        
    );



 

https://www.jianshu.com/p/4e997f5deda9

 

 

3.afnetworking

为每一个NSURLSessionDownloadTask创建AFURLSessionManagerTaskDelegate,把请求的completionHandler也放在delegate。

从统一的回调didCompleteWithError到delegate的didCompleteWithError,再调用completionHandler返回。

 

- (void)addDelegateForDownloadTask:(NSURLSessionDownloadTask *)downloadTask
                          progress:(void (^)(NSProgress *downloadProgress)) downloadProgressBlock
                       destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
                 completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler

    AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init];
    delegate.manager = self;
    delegate.completionHandler = completionHandler;

    if (destination) 
        delegate.downloadTaskDidFinishDownloading = ^NSURL * (NSURLSession * __unused session, NSURLSessionDownloadTask *task, NSURL *location) 
            return destination(location, task.response);
        ;
    

    downloadTask.taskDescription = self.taskDescriptionForSessionTasks;

    [self setDelegate:delegate forTask:downloadTask];

    delegate.downloadProgressBlock = downloadProgressBlock;

 

 

response

- (void)URLSession:(NSURLSession *)session
              task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error

    AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:task];

    // delegate may be nil when completing a task in the background
    if (delegate) 
        [delegate URLSession:session task:task didCompleteWithError:error];
...
//需要加锁
- (AFURLSessionManagerTaskDelegate *)delegateForTask:(NSURLSessionTask *)task 
    NSParameterAssert(task);

    AFURLSessionManagerTaskDelegate *delegate = nil;
    [self.lock lock];
    delegate = self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)];
    [self.lock unlock];

    return delegate;


...
//每一个delegate

#pragma mark - NSURLSessionTaskDelegate

- (void)URLSession:(__unused NSURLSession *)session
              task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgnu"
    __strong AFURLSessionManager *manager = self.manager;

    __block id responseObject = nil;

    __block NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
    userInfo[AFNetworkingTaskDidCompleteResponseSerializerKey] = manager.responseSerializer;

    //Performance Improvement from #2672
    NSData *data = nil;
    if (self.mutableData) 
        data = [self.mutableData copy];
        //We no longer need the reference, so nil it out to gain back some memory.
        self.mutableData = nil;
    

    if (self.downloadFileURL) 
        userInfo[AFNetworkingTaskDidCompleteAssetPathKey] = self.downloadFileURL;
     else if (data) 
        userInfo[AFNetworkingTaskDidCompleteResponseDataKey] = data;
    

    if (error) 
        userInfo[AFNetworkingTaskDidCompleteErrorKey] = error;

        dispatch_group_async(manager.completionGroup ?: url_session_manager_completion_group(), manager.completionQueue ?: dispatch_get_main_queue(), ^
            if (self.completionHandler) 
                self.completionHandler(task.response, responseObject, error);
            

            dispatch_async(dispatch_get_main_queue(), ^
                [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidCompleteNotification object:task userInfo:userInfo];
            );
        );
     else 
        dispatch_async(url_session_manager_processing_queue(), ^
            NSError *serializationError = nil;
            responseObject = [manager.responseSerializer responseObjectForResponse:task.response data:data error:&serializationError];

            if (self.downloadFileURL) 
                responseObject = self.downloadFileURL;
            

            if (responseObject) 
                userInfo[AFNetworkingTaskDidCompleteSerializedResponseKey] = responseObject;
            

            if (serializationError) 
                userInfo[AFNetworkingTaskDidCompleteErrorKey] = serializationError;
            

            dispatch_group_async(manager.completionGroup ?: url_session_manager_completion_group(), manager.completionQueue ?: dispatch_get_main_queue(), ^
                if (self.completionHandler) 
                    self.completionHandler(task.response, responseObject, serializationError);
                

                dispatch_async(dispatch_get_main_queue(), ^
                    [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidCompleteNotification object:task userInfo:userInfo];
                );
            );
        );
    
#pragma clang diagnostic pop

 

第25月第11天deeplearning.ai

1.网易云课堂深度学习工程师点击进入课程地址(英文)(收费)点击进入课程地址(中文)(免费)第一门神经网络和深度学习第二门改善神经网络第三门结构化机器学习项目第四门卷积神经网络第五门序列模型  查看详情

第26月第20天springboot

1.1、pom.xml中添加支持web的模块:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>pom.xml文件中默认有两个模块:spring- 查看详情

第25月第4天djangochinaorg项目记录01

#------------------------------1.djangochinaorg项目https://github.com/DjangoChinaOrg/Django-China-APIhttps://github.com/DjangoChinaOrg/Django-China-FE 2.vueproxyTableproxyTable:‘/proxy‘:target:‘h 查看详情

第26月第2天vimjavacomplete

1.将解压出来的autoload和doc的内容添加到~/.vim/下的相应目录下,如果~/.vim下没有这两个文件夹就手动创建其中autoload里的有javacomplete.vimjava_parser.vimReflection.java三个文件,要做的事情是编译:javacReflection.java得到一个.class文件将.clas... 查看详情

第13月第25天ios11uitableviewreloaddatacontentsize

1.          [tableViewreloadData];        dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(0.1*NSEC_PE 查看详情

第18月第25天github下载单个文件夹

1.用SVN即可.举例说明:譬如这个项目:Mooophy/Cpp-Primer·GitHub,我只想看ch03文件夹的代码怎么办?先打开ch03,其URL为:"https://github.com/Mooophy/Cpp-Primer/tree/master/ch03"(这里添加空格,为了防止知乎智能识别)将/tree/master/换成/trunk/.(这个以前... 查看详情

第9月第26天pairs和ipairs

1.a={ip="127.0.0.1",port=6789}fori,vinpairs(a)doprint(i,v)end a={1}fori,vinipairs(a)doprint(i,v)endhttp://blog.csdn.net/witch_soya/article/details/7556595 查看详情

第25月第2天django项目01

1.exportPATH="$PATH":/Applications/XAMPP/xamppfiles/bin/ sudoln-s/Applications/XAMPP/xamppfiles/lib/libmysqlclient.18.dylib/usr/lib/libmysqlclient.18.dylib  更新20160318的node  3 查看详情

第32月第12天blockstop(代码片段)

1.-(NSMutableArray*)filterUsingBlock:(BOOL(^)(idobj,NSUIntegeridx,BOOL*stop))blockif(!block)return[selfmutableCopy];NSMutableArray*result=[NSMutableArrayarray];NSUIntegeridx=0;BOOLstop=NO;for(idobj 查看详情

第27月第10天cmake(代码片段)

1.error:tool‘xcodebuild‘requiresXcode的解决办法 sudoxcode-select--switch/Applications/Xcode.app/Contents/Developer/   https://blog.csdn.net/shorewb/article/details/52447554  2 查看详情

第20月第29天cocoa抽象工厂(代码片段)

1.在CocoaTouch框架中,类簇是抽象工厂模式在iOS下的一种实现,以NSArray举例,将原有的alloc+init拆开写:idobj1=[NSArrayalloc];//__NSPlacehodlerArray*idobj2=[NSMutableArrayalloc];//__NSPlacehodlerArray*idobj3=[obj1init];//__NSArrayI*idobj4 查看详情

第19月第20天uitableview:改变tableheaderview的高度(代码片段)

1.UITableView:改变TableHeaderView的高度CGRectnewFrame=headerView.frame;newFrame.size.height=newFrame.size.height+webView.frame.size.height;headerView.frame=newFrame;[self.tableViewsetTableHeaderView:header 查看详情

第43月第10天uiimage写文件(代码片段)

1.-(void)saveImage:(CGImageRef)imagedirectoryURL:(NSURL*)directoryURLfilename:(NSString*)filename@autoreleasepoolNSURL*fileURL=[directoryURLURLByAppendingPathComponent:filename];//fileURL=[NSURLfileURLWithPath:[NSStringstringWithFormat:@"%@/%@",directory,filename]];CFURLRefurl=(__bridgeCFURLRef)file... 查看详情

第9月第3天uilabelcontentscale

1. http://blog.csdn.net/u012703795/article/details/43706449 查看详情

第9月第30天mvp

1. importUIKitstructPerson{//ModelletfirstName:StringletlastName:String}protocolGreetingView:class{funcsetGreeting(greeting:String)}protocolGreetingViewPresenter{init(view:GreetingView,person:Per 查看详情

第16月第27天pipinstallvirtualenv

1.pipinstallvirtualenvvirtualenvtestvircdtestvircdScriptsactivatepipinstalldjango==1.9.8 https://zhuanlan.zhihu.com/p/32286726 查看详情

第2月第24天coretext行高

1.NSMutableAttributedString 行高 NSMutableAttributedString*attributedString=[[NSMutableAttributedStringalloc]initWithString:labelText];NSMutableParagraphStyle*paragraphStyle=[[NSMutableParagra 查看详情

第10月第28天touchesbegan

1.-(void)touchesBegan:(NSSet*)toucheswithEvent:(UIEvent*)event{[[selfnextResponder]touchesBegan:toucheswithEvent:event];[supertouchesBegan:toucheswithEvent:event];}-(void)touchesMoved:(NSSet*)touchesw 查看详情