首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当一个dispatch_async线程在另一个类中执行时,有没有办法在UIViewController类中等待?

当一个dispatch_async线程在另一个类中执行时,UIViewController类可以通过信号量(Semaphore)来等待线程完成。

信号量是一种同步机制,用于控制线程的执行顺序。在这种情况下,您可以在UIViewController类中创建一个信号量,并将其作为参数传递给执行dispatch_async的方法。当线程执行完成时,通过信号量发出信号,UIViewController类可以使用信号量的等待方法等待该信号。

下面是一个示例代码:

代码语言:txt
复制
import Foundation

class AnotherClass {
    func performAsyncTask(completion: @escaping () -> Void) {
        DispatchQueue.global().async {
            // 在此执行任务
            
            // 任务完成后发出信号
            completion()
        }
    }
}

class MyViewController: UIViewController {
    func waitAsyncTask() {
        let semaphore = DispatchSemaphore(value: 0)
        
        let anotherClass = AnotherClass()
        anotherClass.performAsyncTask {
            // 任务完成后释放信号
            semaphore.signal()
        }
        
        // 等待信号量,直到信号被发出
        semaphore.wait()
        
        // 在此处执行您希望在任务完成后执行的代码
    }
}

在上述代码中,performAsyncTask方法是在AnotherClass中执行的异步任务。在MyViewController中的waitAsyncTask方法中,我们创建了一个信号量并将其初始值设置为0。然后,我们通过将信号量作为参数传递给performAsyncTask方法来执行异步任务,并在任务完成时发出信号。最后,在waitAsyncTask方法中使用semaphore.wait()来等待信号量,直到信号被发出。这样,UIViewController类就能够等待dispatch_async线程的执行完成。

请注意,这只是一种处理此类情况的方法之一,可能不适用于所有情况。具体的实现方式可能会因您的应用程序结构和需求而有所不同。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【API使用系列】Notification消息通知专题

; } - (void)test { NSLog(@"================="); } - (void)dealloc { [super dealloc]; } @end 另一个引用...1.1.2 ViewController不手动移除通知不挂机原因分析 现在我们UIViewController中注册通知,不移除,看看会不会挂掉。...看来看去,也只能说明是UIViewController自己销毁的时候帮我们暗地里移除了。 那我们如何证明呢?由于我们看不到源码,所以也不知道有没有调用。...是不是可以证明系统的UIViewController销毁的时候调用了这个方法。(不建议大家开发的时候用类别的方式覆盖原有的方法,由于类别方法具有更高的优先权,所以有可能影响到其他地方。...你这边可要注意了,一定要成双成对出现,如果你只viewWillAppear addObserver没有viewWillDisappear removeObserver那么消息发生的时候,你的方法会被调用多次

40910

iOS数据埋点统计方案(附Demo): 运行时Method Swizzling机制与AOP编程(面向切面编程)

通过继承和重写系统方法 -- 利用写好统计的一个,让需要VC继承自该基,或者调用重写过统计逻辑的按钮基等等。...替换系统方法的分类:通过运行时Runtime的办法 -- 利用Method Swizzling机制进行方法替换:替换原来的需要在里面统计却不含统计逻辑的方法 为 新的包含了统计逻辑的方法。...为VC设计的分类:运行时Method Swizzling方案 ? 场景需求:需要监听全局的某一的同一方法 这种方案被监听的方法单一,但会影响全局的所有的的该方法。...Aspects 是iOS平台一个轻量级的面向切面编程(AOP)框架,只包括两个方法:一个方法,一个实例方法。...AppDelegate的方法根据Plist监听清单进行HOOK 场景需求:需要监听不同类,不同按钮,系统方法,及表单元点击事件 方案特点:是可代码配置需要监听的清单Plist,但是不能将需要注入的统计代码块

89910
  • 深入理解GCD

    Asynchronous异步 GCD ,这些术语描述一个函数相对于另一个任务完成,此任务是该函数要求 GCD 执行的。一个同步函数只完成了它预定的任务后才返回。...如果一个 Block 的执行时间与另一个重叠,也是由 GCD 来决定是否将其运行在另一个不同的核心上,如果那个核心可用,否则就用上下文切换的方式来执行不同的 Block 。...然后另一个线程线程B)可能进入 if ,分配单例实例的内存,然后退出。 系统上下文切换回线程A,你会分配另外一个单例实例的内存,然后退出。...它为调用者生成一个不可变的拷贝,防止调用者不当地改变数组,但这不能提供任何保护来对抗一个线程调用读方法 photos 的同时另一个线程调用写方法 addPhoto: 。...临界区稍后执行时,这将是你队列唯一执行的条目。 这是添加对象到数组的实际代码。

    1.5K10

    MJRefresh源码剖析与学习

    self.window为空的时候,突然刷新崩溃(从另一个页面返回的时候),所以需要一个状态来过渡。...MJRefreshStateIdle; }); } 线程结束刷新,把刷新状态改为普通闲置状态 5、KVO监听 #pragma mark - KVO监听 - (void)addObservers...,另一个是 手指是否离开屏幕。...image 由此看来,这两种形式的header都有相同的共性,我们在做类似的功能时,如果有几个控件或者几个共性一样,比如说,一个保险(InsuranceClass),一个房地产(RealEstateClass...),他们可以有一个销售(SalesClass),SalesClass拥有销售员工、顾客、金额、销售日期等 保险 和 房地产 需要的共同属性 四、MJRefreshNormalHeader

    1.6K51

    Object-C特性埋点

    只是语言层面上加了些关键字和语法。真正让Objective-C如此强大的是它的运行时。它很小但却很强大。它的核心是消息分发。 运行时会发消息给对象。一个对象的class保存了方法列表。...第一个问题的答案很简单。class的方法列表其实是一个字典,key为selectors,IMPs为value。一个IMP是指向方法在内存的实现。...但是对于点击事件,这个是我们自己写的一个方法,它的父UIViewController是没有的,所以执行我们自己点击事件的方法时UIViewController分类要嵌入的方法是不会被调用的,这时候怎么办...问题2:对于是否上传和具体的业务逻辑相关的情况,我们可以用方法所在一个属性值进行标记,这个属性写在.m文件即可(KVC可以获取.m文件的属性值。)...,我们先执行要hook那个的方法,然后根据plist配置的相关标记进行相应的处理(这里的属性值其实也是不必要的,我么可以根据名和方法名字符串的哈希生成唯一的key,然后利用runtime自动关联到这个

    1.6K60

    线程-GCD

    放到并行队列的任务,GCD 也会 FIFO的取出来,但不同的是,它取出来一个就会放到别的线程,然后再取出来一个又放到另一个线程。这样由于取的动作很快,忽略不计,看起来,所有的任务都是一起执行的。...信号量 当我们处理一系列线程的时候,数量达到一定量,以前我们可能会选择使用NSOperationQueue来处理并发控制,但如何在GCD快速的控制并发呢?...一个线程一个信号量上等待时,线程会被阻塞(如果有必要的话),直至计数器大于零,然后线程会减少这个计数。...使用GCD的信号量实现并发的控制 创建了一个初使值为10的semaphore,每一次for循环都会创建一个新的线程线程结束的时候会发送一个信号,线程创建之前会信号等待,所以同时创建了10个线程之后...dispatch_time(): #使用此方法创建的任务首先会查看队列中有没有别的任务要执行,如果有,则会等待已有任务执行完毕再执行;同时在此方法后添加的任务必须等待此方法任务执行后才能执行。

    1.1K20

    线程和GCD

    一个线程任务的执行是串行的 如果要在一个线程执行多个任务,那么只能一个一个地按顺序执行这些任务 也就是说,同一时间内,一个线程只能执行一个任务 比如在一个线程中下载三个文件(分别是文件A、文件B...同步:在当前线程执行任务,不具备开启新线程的能力 异步:新的线程执行任务,具备开启新线程的能力 并发:多个任务并发(同时)执行 串行:一个任务执行完毕后,再执行下一个任务 获取串行队列: dispatch_queue_t...也就是说死锁的条件是因为dispatch_sync()方法等待Block执行完毕,而Block等待dispatch_sync()方法往下执行才能轮到它。...主队列直接在主线程执行。 线程切换 之前说过,程序遇到耗时操作就要把操作放在另外一个线程执行。执行过之后,就需要把耗时操作得到的数据带回到主线程对UI进行刷新操作,这时就可以用如下代码。...此时有一个办法,就是把操作统一放在一个线程里做,这样我能知道线程执行结束的时间,但缺点是这些耗时的操作是串行的。 如果让这些操作并行执行,那效率就更高了,但我该怎么知道全部操作都执行完的时间呢?

    1.1K10

    面试官问:“项目中用过多线程吗?”你就把这个案例讲给他听!

    实现 Runnable接口:如果自己的已经 extends 另一个,就无法直接 extends Thread,此时,可以实现一个Runnable 接口。...⾏monitorexit指令时则会把计数器-1,计数器值为0时,则锁释放,处于等待队列线程再继续竞争锁。...ABA 问题: 比如说一个线程 one 从内存位置 V 取出 A,这时候另一个线程 two 也从内存取出 A,并且 two 进行了一些操作变成了 B,然后 two 又将 V 位置的数据变成 A,这时候线程...一个线程完成任务时,它会从队列取下一个任务来执行。...:丢弃等待队列中最旧的任务,并⾏当前任务 DiscardPolicy:直接丢弃任务,也不抛出异常 面试官:说一下你的核心线程数是怎么选的 线程Java属于稀缺资源,线程池不是越大越好也不是越小越好

    1.5K10

    iOS移动端用户统计开发文档

    开发者根据业务需求相关的模块进行设置id,SDK通过运行时进行数据收集 Runtime 页面统计 关键代码 -(void)setPageEvent:(id)pageEvent; 使用方法 - (void...文件配置需要统计的页面名以及页面ID 方法统计 关键代码 + (void)trackBttonEvent{ __weak typeof(self) ws = self; //设置事件统计...initWithContentsOfFile:path]; for (NSString *classNameString in eventStatisticsDict.allKeys) { //使用运行时创建对象...const char * className = [classNameString UTF8String]; //从一个字串返回一个...文件配置需要统计的方法名称以及方法ID 项目中部分特殊业务逻辑可单独调用ICClickRecord的event方法进行事件统计 ---- 统计数据存储模块 事件触发-->存储 ICClickRecord

    56250

    肝了一夜的66道并发多线程面试题,你不来个666吗?

    2、wait() wait()是Object的⽅法,⼀个线程⾏到wait⽅法时,它就进⼊到⼀个和该对象相关的等待池,同时释放对象的机锁,使得其他线程能够访问,可以通过notify,notifyAll...概念:是指两个或两个以上的进程⾏过程,因争夺资源⽽造成的⼀种互相等待的现象,若⽆外⼒作⽤,它们都将⽆法推进下去。...线程持有上⼀个线程的对象锁以及自⼰的锁,由于这种依赖关系,该线程⾏需要等待上个对象释放锁,从⽽ 保证线程⾏的顺序。 b....数据库死锁机制和解决⽅案: 死锁:死锁是指两个或者两个以上的事务⾏过程,因争夺锁资源⽽造成的⼀种互相等待的现象。...3、⼀个线程完成任务时,它会从队列取下⼀个任务来⾏。

    92510

    React Native iOS原生模块开发实战|教程|心得

    @end 查看视频教程 ImageCrop,我们调用了Crop来实现从iOS相册获取图片并裁切图片的功能,调用Crop的时候我们用的是懒加载的方式。为什么要用懒加载呢?...关于线程 React Native一个独立的串行GCD队列调用原生模块的方法。...我们为React Native开发原生模块的时候,如果有耗时的操作比如:文件读写、网络操作等,我们需要新开辟一个线程,不然的话,这些耗时的操作会阻塞JS线程。...如果你的方法“只有一个”是耗时较长的(或者是由于某种原因必须在不同的队列运行的),你可以函数体内用dispatch_async方法来另一个队列执行,而不影响其他方法: dispatch_async...还有一个需要告诉大家的是,如果原生模块需要更新UI,我们需要获取主线程,然后线程更新UI,如: dispatch_async(dispatch_get_main_queue(), ^

    2K60

    iOS_多线程五:基础的9种锁,扩展12种使用

    ): 线程会因为条件变量不满足而阻塞,线程也可以释放锁时将条件变量改成某个值,从而唤醒满足条件变量的线程 递归锁(recursivelock): 跟互斥类似, 但是允许同一个线程未释放锁前,加锁N次锁...一个线程解锁之前又锁上,将导致死锁。    尝试解除其他线程上的锁,结果不可预测。    尝试解除一个未锁定的锁,结果不可预测。  ...一个线程尝试重新锁定一个还未解开的锁时,将会返回一个错误。    尝试解除其他线程上的锁,将会返回一个错误。    尝试解除一个未锁定的锁,将会返回一个错误。  ...PTHREAD_MUTEX_RECURSIVE: 递归锁    一个线程可以多次锁定一个还未解开的锁,需要相同数量的解锁来释放锁,然后另一个线程才能获的互斥锁    尝试解除其他线程上的锁,将会返回一个错误...参数只是一个标识符,多个异步线程传入的参数一致时会触发锁机制,不一致时,则不会阻塞。

    81810

    python线程笔记

    Python 中使用线程 Win32 和 Linux, Solaris, MacOS, *BSD 等大多数 Unix 系统上运行时,Python 支持多线程 编程。...我们有没有更好的办法替换使用sleep() 这种不靠谱的同步方式呢?答案是使用锁,使用了锁,我们就可以两个线程都退出之后马上退出。 为什么我们不在创建锁的循环里创建线程呢?...守护线程 另一个避免使用 thread 模块的原因是,它不支持守护线程线程退出时,所有的子线程不 论它们是否还在工作,都会被强行退出。...创建一个Thread的实例,传给它一个函数 创建一个Thread的实例,传给它一个可调用的对象 从Thread派生出一个子类,创建一个这个子类的实例 下边是三种不同方式的创建线程的示例: 与传一个函数很相似的另一个方法是创建线程的时候...Event 事件用于在线程间通信。一个线程发出一个信号,其他一个或多个线程等待。 Event 通过通过 个内部标记来协调多线程运 。 法 wait() 阻塞线程 ,直到标记为 True。

    1.3K50

    创建Java线程

    Java每个线程有自己的堆栈和程序 计数器(PC),其中堆栈是用来跟踪线程的上下文(上下文是线程执行到某处时,当前的局部变量的值),而程序计数器则用来跟踪当前线程正在执行的指令。...线程的方法start()被调用时,这个线程就会进行排队状态,等待调度程序将它 转入运行状态(Running)。一个进程被执行后它也可以进行排队状态。...2.运行状态(Running),调度程序将CPU的运行时间分配给一个线程,这个线程就进入了运行状态开始运行。...要创建一个线程,必须创建一个从Thread扩展出的新。由于Thread中方法run()没有提供任何的操作,因此,创 建线程时用户必须覆盖方法run()来完成有用的工作。... Java,如果每当一个请求到达就创建一个线程,开销是相当大的。

    90820

    Java 线程池原理与使用

    java 我们会一般要求创建线程必须使用线程池,因为这样可以避免资源消耗,通过重复利用已经创建的线程来降低线程创建和销毁所造成的消耗, 其次任务到达时任务可以不用等到线程创建就立即执行,最后可以提高线程的管理性..., milliseconds,runnableTaskQueue, handler); corePoolSize(线程池的基本大小): 提交一个任务到线程池时,线程 池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务...每个插入操作必 须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态, 吞吐量通常要高于 LinkedBlockingQueue,静态工厂方法 Executors.newCachedThreadPool...线程池执行过程 提交一个任务到线程池,首先判断基本线程池是否已满,没有满不管线程池中有没有空闲线程都创建一个线程来执行任务, 判断工作队列是否已满,没满则将新提交的任务存储工作队列, 满了, 判断整个线程池是否已满...: 线程池创建线程时,会将线程封装成工作线程 Worker,Worker 行完任务后,还会无限循环获取工作队列里的任务来执行。

    46610

    iOS多线程开发之深入GCD 原

    iOS多线程开发之深入GCD 一、前言         以前的一些系列博客,对iOS中线程的管理做了总结,其中涵盖了GCD的相关基础知识:http://my.oschina.net/u/2340880...需要注意的是,这里只是将任务延时加入队列,并不是执行,如果是加入同步队列,则会进入等待状态。...三、数据存取的线程安全问题         进行多线程编程时,或许总会遇到一问题,数据的竞争与线程的安全。这些问题如果我们通过程序手动来控制难度将会非常大。...首先,如果只是在读取数据,而不对数据做任何修改时,我们并不需要处理安全问题,可以让多个任务同时进行读取,可是如果要对数据进行写的操作,那么同一时间,我们就必须只能有一个任务写,GCD中有一个方法帮我们完美的解决了这个问题...,可是并不能保证程序百分百的安全,因为线程的操作,会有可能初始化多个对象,GCD,我们可以使用如下方式: +(instancetype)shared{     static Auto * obj

    29410

    iOS初步集成极光推送后你还要做这些事

    有多个类型通知的时候,怎么拿到服务器发送过来的extras的内容,然后根据类型做出正确的跳转? ● 怎么app内部开启、关闭通知?...你可以在这里写一个UIAlertController提示,也可以像我一样提示顶部,取决你们UI设计。...这个 法,选择 是否提醒 户,有Badge、Sound、Alert三种类型可以选择设置 } 上面代码我选择了一个提示的第三方TSMessage点击消息的时候做了一个跳转。...自定义消息,这个比较特殊,它必须是app正在前台的时候才能收到消息,收到消息的位置而且不在代理,而是一个通知。 ? 注册极光后可以加入下面代码。注册一个通知。...极光提供了几种区分用户的方法,Web我们可以看到 ? image.png 设备标签、别名、ID、群推 标签和别名差不多。只说别名。

    2.8K50

    2020-iOS最新面试题解析—1(原理篇)

    而 super 本质是一个编译器标示符,和 self 是指向的同一个消息接受者 * 使用 self 调用方法时,会从当前的方法列表开始找,如果没有,就从父再找; * 而使用 super...不能向编译后得到的增加实例变量; 能向运行时创建的添加实例变量; 分析如下: 因为编译后的已经注册runtime结构体的objc_ivar_list 实例变量的链表和instance_size...这里强调一点:线程以+scheduledTimerWithTimeInterval...的方式触发的timer默认是运行在NSDefaultRunLoopMode模式下的,滑动页面上的列表时,进入了...// 如果这里还有基于上面两个任务的结果继续执行一些代码,建议还是放到子线程,等代码执行完毕后回到主线程 // 回到主线程 dispatch_async(group, dispatch_get_main_queue...然后该类的方法列表以及其父方法列表寻找方法运行 * 如果,最顶层的父依然找不到相应的方法时,程序在运行时会挂掉并抛出异常unrecognized selector sent to XXX

    1.7K21

    关于线程的知识,你知道多少?

    来启动 不管是哪种方式,所有的线程对象都必须是Thread或其⼦的实例,每个线程的作⽤是完成⼀定的任务,实际上就是⾏⼀段程序流,即⼀段顺序⾏的代码,任务执行完毕之后就结束了。... Java ,通过Thread来创建并启动线程的步骤如下: 1.定义Thread的⼦,并重写该类的run()方法 2.通过Thread子类,初始化线程对象 3.通过线程对象,调用start()...所谓的多线程,其实就是两个及以上线程的代码可以同时运行,而不必一个线程需要等待另一个线程内的代码执行完才可以运行。...4.等待状态(WAITING):处于这种状态的线程不会被分配 CPU 执行时间,它们要等待被显式地唤醒,否则会处于无限期等待的状态。...比如运行状态的线程执行wait方法,会把线程放在等待队列,直到被唤醒或者因异常自动退出 5.超时等待状态(TIMED_WAITING):处于这种状态的线程不会被分配 CPU 执行时间,不过无须无限期等待被其他线程显式地唤醒

    12020

    iOS开发·runtime原理与实践: 消息转发篇(Message Forwarding) (消息机制,方法未实现+API不兼容奔溃,模拟多继承)

    例如:我们可以为了避免直接闪退,可以消息没法处理时在这个方法给用户一个提示,也不失为一种友好的用户体验。 其中,参数invocation是从哪来的?...一个对象由于没有相应的方法实现而无法响应某个消息时,运行时系统将通过forwardInvocation:消息通知该对象。...)); } @end 因为category复写了父的方法,会出现下面的警告: ?...解决办法就是Xcode的Build Phases的资源文件里,在对应的文件后面 -w ,忽略所有警告。 ?...好,你说不支持多继承,那你有没有模拟多继承特性的办法? 转发和继承相似,可用于为OC编程添加一些多继承的效果,一个对象把消息转发出去,就好像他把另一个对象中放法接过来或者“继承”一样。

    2K11
    领券