用dispatch_semaphore_t解决block异步执行返回结果问题

摘要:
1.这是AFN3.0中的一段代码。它使用技术信号的形式来等待异步执行的结果,并返回结果-(NSArray*)tasksForKeyPath:(NSString*)keyPath{__blockNSArray*tasks=nil;dispatch_semaphore_t信号量=dispatch_semaphore_create(0);[self.sessionTasksWi
1.这是AFN3.0里边的一段代码.利用的是技术信号的形式,等待异步执行的结果,并将结果返回.

- (NSArray *)tasksForKeyPath:(NSString *)keyPath

 {
    __block NSArray *tasks = nil;
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
        if ([keyPath isEqualToString:NSStringFromSelector(@selector(dataTasks))]) {
            tasks = dataTasks;
        } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(uploadTasks))]) {
            tasks = uploadTasks;
        } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(downloadTasks))]) {
            tasks = downloadTasks;
        } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(tasks))]) {
            tasks = [@[dataTasks, uploadTasks, downloadTasks] valueForKeyPath:@"@unionOfArrays.self"];
        }
        dispatch_semaphore_signal(semaphore);
    }];
    dispatch_semaphore_wait(semaphore);
    return tasks;
}

2.Dispatch Queue没有"取消"这一概念,一旦将处理追加到Dispatch Queue中,就没有办法可将该处理去除,也没有办法可在执行中取消该处理.但是可以使用NSOperationQueue中的取消.

免责声明:文章转载自《用dispatch_semaphore_t解决block异步执行返回结果问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SpringBoot初学(4)– JdbcTemplate和MybatisV3s录音 交叉编译alsa linux下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Smarty 模板布局继承

Smarty 模板继承 在覆盖父模板的{block}块以外的地方, 子模板不能定义任何内容。任何在{block}以外的 内容都会被自动忽略。在子模板和父模板中的{block}内容,可以通过 append 和 prepend来进行合并。 {block}的选项,和 {$smarty.block.parent} 或 {$smarty.block.child}会持...

Oracle RAC 全局等待事件 gc current block busy 和 gc cr multi block request 说明--转载(http://blog.csdn.net/tianlesoftware/article/details/7777511)

一.RAC 全局等待事件说明 在RAC环境中,和全局调整缓存相关的最常见的等待事件是global cache cr request,global cache busy和equeue。 当一个进程访问需要一个或者多个块时,Oracle会首先检查自己的Cache是否存在该块,如果发现没有,就会先通过global cache赋予这些块共享访问的权限,然后再访问...

LeetCode——多线程问题汇总

目录 Semaphore(信号量) Lock(管程模型) 无锁(可以用有锁的也可以用无锁解决) CountDownLatch(计数器) CyclicBarrier(循环栅栏) 题目举例 把并发调用变成按顺序调用按序打印 把并发调用变成交替调用交替打印FooBar 把并发调用变成按特定规律顺序调用打印零与奇偶数 把并发调用变成按特定规律顺...

计算机组成原理 — GPU 图形处理器

目录 文章目录 目录 显卡 GPU GPU 与深度学习 GPU 与 CPU 体系结构的区别 GPU 显存与 CPU 主存的区别 GPU 与 CPU 之间的数据交互方式 GPU 的体系结构 GPU 的工作原理 GPU 的关键参数 CUDA 编程模型 CUDA 的架构 CUDA 的核心概念 CUDA 的工作原理 云主机显卡的实现方式 虚拟显卡...

iOS开发语法篇block详解

一:基本定义 /*初步上式block定义的一些理解和解释,接下来会详解: *block名为myBlock,结合C的函数指针,myBlock为block体的指针,指向block体的入口地址 *int result = myBlock(5) <==> ^(int num){return num*num}(5)//将5传给num *回调时可以将my...

LaTeX的tasks宏包

tasks 宏包 LaTeX的列表(list)通常是将项(item,条目)一个一个垂直的平行显示,所谓“列”表的由来。 水平分列列表,即将多个项分散到各列而不是一列,在出考卷的选择题时常碰到,LaTeX中的包有:enumcols(enumlists)、tasks(exsheets) enumcols宏包是李清创建的,TeXlive 2018后,与CTeX的...