二 延迟执行 [obj performSelector:@selector(play) withObject:@"李周" afterDelay:4.f]; 该方法将延迟4秒后再执行play方法。...其实说到对时间方面的处理在项目中经常用到的是NSTimer:当一个NSTimer注册到Runloop后,Runloop会重复的在相应的时间点注册事件,当然Runloop为了节省资源并不会在准确的时间点触发事件...而performSelector:withObject:afterDelay:其实就是在内部创建了一个NSTimer,然后会添加到当前线程的Runloop中。...:@selector(test) withObject:nil afterDelay:2]; 如果在子线程中调用该performSelector延迟方法,会发现调用该延迟方法的子线程和test方法中执行的子线程是同一个...在回答完延迟方法之后,会将该方法和performSelector:withObject:作对比,那么performSelector:withObject:在不添加到子线程的Runloop中时是否能执行?
:@selector(completion) withObject:nil afterDelay:0]; NSLog(@"2"); }); - (void)completion { NSLog...看一下官方文档说明: 这个方法会在当前线程的 runloop 中创建一个计时器来执行该消息。...当计时器触发时,线程尝试从 runloop 中出列该消息并执行该函数。 如果 runloop 在运行并且处于 default 模式则执行成功。...如果希望消息能在其他模式下也能出列,可以使用performSelector:withObject:afterDelay:inModes: 代替。...如: [self performSelector:@selector(test) withObject:nil afterDelay:2 inModes:@[NSRunLoopCommonModes]]
withObject:(id)object; – (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2...withObject:(id)object 这是要传递的参数 2、 – (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument...afterDelay:(NSTimeInterval)delay inModes:(NSArray *)modes; – (void)performSelector:(SEL)...aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay; 这两个方法为异步执行,只能在主线程中执行...可用于点击UI中一个按钮会触发一个消耗性能的事件,在事件执行期间按钮会一直处于高亮状态,此时可以调用该方法去异步的处理该事件,避免上述问题。
1.2.2 b)下拉刷新事件监听 当用户进行下拉刷新操作时,UIRefreshControl会触发一个UIControlEventValueChanged事件,通过监听这个事件,我们就可以进行类似数据请求的操作了...,2秒钟后,调用handleData....[self performSelector: @selector(handleData) withObject: nil afterDelay: 2]; 在handleData里面,就表示已经请求到了数据...: @selector(refreshTable) withObject: nil afterDelay: 3.0f]; } - (void) pullTableViewDidTriggerLoadMore...: nil afterDelay: 3.0f]; } • 对于UI的配置,在ViewDidLoad()方法里面添加下面代码(比如 修改刷新和上拉的背景色箭头头像等) self.pullTableView.pullArrowImage
目录 一、NSThread 1、一些类方法 2、创建方式 (1)、alloc init创建,但是需要手动开启 (2)、初始化一个子线程,特点:自动开启,是类方法 (3)、performSelector隐式创建...(顺便说一下performSelector其他方法) 二、performSelector 1、afterDelay在子线程中未执行 2、实现:多次点击, 只执行最后一次 三、需要手动加锁(线程同步)(...performSelector:@selector(network:) withObject:@{@"name":@"moxiaoyan"} withObject:@{@"name":@"moxiaohui...: withObject: afterDelay: 1....:) object:nil]; [self performSelector:@selector(afterDelay:) withObject:nil afterDelay:2]; // 2s后执行
并发队列 (双行(多行)道路 可以超车 只要你可以) 可以让多个任务并发执行 (异步的时候可以超车 所以可以并发) 同步或者异步 (你有没有超车的能力) 是否具备开启新线程的能力 串行队列 (单行线) 任务一个接一个...:@selector(test) withObject:nil afterDelay:0]; NSLog(@"3"); }); } - (void) test { NSLog...performSelector: withObject: 底层调用[self msgSend]; performSelector: withObject:afterDelay; RunLoop相关 往RunLoop...里面添加一个定时器 解决办法:: 开启线程RunLoop 案例2 题目: - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent...分析原因: block执行完毕后 线程没有开启RunLoop。所以线程销毁,销毁后再调用所以崩溃。
)sender { dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"1"); [self performSelector...:@selector(test) withObject:nil afterDelay:0]; NSLog(@"2"); }); } - (void)test { NSLog...(@"3"); } 答案是只打印:1、2 因为[self performSelector:@selector(test) withObject:nil afterDelay:.0]实际在runloop里面...,是一个定时器,但是因为在子线程,runloop是默认没有开启的。...实现原理: 当调用 NSObject 的 performSelecter:afterDelay: 后,实际上其内部会创建一个 Timer 并添加到当前线程的 RunLoop 中。
preformSelector在delay 0秒时的执行顺序 - (void)mainMethod { [self performSelector:@selector(delayMethod...) withObject:nil afterDelay:1]; NSLog(@"调用方法==开始"); sleep(5); NSLog(@"调用方法==结束..."); } - (void)delayMethod { NSLog(@"执行延迟方法"); } 输出: 调用方法==开始 调用方法==结束 执行延迟方法 这个方法是单线程的,也就是说只有当前调用此方法的函数执行完毕后
当调用 NSObject 的 performSelecter:afterDelay: 后,实际上其内部会创建一个 Timer 并添加到当前线程的 RunLoop 中。...8.PerformSelector:afterDelay:这个方法在子线程中是否起作用? 不起作用,子线程默认没有 Runloop,也就没有 Timer。...当一个硬件事件(触摸/锁屏/摇晃等)发生后,首先由 IOKit.framework 生成一个 IOHIDEvent 事件并由 SpringBoard 接收。这个过程的详细情况可以参考这里。...NSTimer的精确度就显得低了点,比如NSTimer的触发时间到的时候,runloop如果在阻塞状态,触发时间就会推迟到下一个runloop周期。...并且 NSTimer新增了tolerance属性,让用户可以设置可以容忍的触发的时间的延迟范围。
先说下该动画: 进入 AController 后,需要执行一个动画,该动画会执行以下步骤: 将一个 view 从左到右移动,动画时间 0.5s 上一步的动画完成后,将 view hidden 1 秒...:@selector(startBaseAnimation) withObject:nil afterDelay:pauseDuration]; } } 这里有两个问题: CABasicAnimation...) withObject:nil afterDelay:pauseDuration]; 第一个问题要么在 viewWillDisappear 时,手动置该 delegate 为 nil,要么对该 view...隐藏问题 这里还有一个隐藏的问题,就是发现 dealloc 方法,在 pop 页面时,有时能执行,有时不能执行,按理来说有执行了 performSelector 方法,应该是必现的问题。...:@selector(startBaseAnimation) withObject:nil afterDelay:pauseDuration]; } } 而什么时候为 NO 呢,顾名思义就是动画未完成
它的本质是调用函数mach_msg_trap(),相当于是一个系统调用,会触发内核状态切换。...:@selector(test) withObject:nil afterDelay:10]; NSLog(@"3"); }); NSLog(@"4"); - (void)test {...原因是如果是带afterDelay的延时函数,会在内部创建一个 NSTimer,然后添加到当前线程的RunLoop中。也就是如果当前线程没有开启RunLoop,该方法会失效。...:@selector(test) withObject:nil afterDelay:10]; NSLog(@"3"); }); 然而test方法依然不执行。...[self performSelector:@selector(test) withObject:nil afterDelay:10]; [[NSRunLoop currentRunLoop
:performSelector:withObject:afterDelay:,performSelector:withObject:afterDelay:inModes:,cancelPreviousPerformRequestsWithTarget...:selector:object: 5)NSObject(NSThreadPerformAddition): 比如这些方法:performSelectorInBackground:withObject:...,performSelectorOnMainThread:withObject:waitUntilDone:,performSelector:onThread:withObject:waitUntilDone...),如UIEvent,CFSocket; 2、Source1:由Runloop和内核管理,mach port驱动,如CFMachPort(轻量级的进程间通信的方式,NSPort就是对它的封装,还有Runloop...UIInitializationRunLoopMode: 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用。
不管时一个手指还是多个手指,轻击操作都会使每个触摸对象的tapCount加1,由于上面的例子不需要知道具体触摸对象的位置或时间等,因此可以直接调用touches的anyObject方法来获取任意一个触摸对象然后判断其...轻击操作很容易引起歧义,比如当用户点了一次之后,并不知道用户是想单击还是只是双击的一部分,或者点了两次之后并不知道用户是想双击还是继续点击。...为了解决这个问题,一般可以使用“延迟调用”函数。...:@selector(setBackground:) withObject:[UIColor blueColor] afterDelay: 2 ]; self.view.backgroundColor...withObject:afterDelay:方法设置2秒中后更改。
:在oc 中通常方法的第一个参数为:触发该方法的对象 --根据需要进行参数调整 1.2 不小心修改头文件的解决方法 对~/Library/Developer/Xcode/DerivedData 目录文件进行清理...[self performSelector:@selector(cleanUpAnimationsArray) withObject:nil afterDelay:self.imageList.animationDuration...); //动画结束之后清除帧动画数组 [self.imageList setAnimationImages:nil]; } 清除内存的代码简化 [self.imageList performSelector...:@selector(setAnimationImages:) withObject:nil afterDelay:self.imageList.animationDuration]; III 常用快捷键...前后两行交换:command+option+[ 或 ] 不同窗口间切换:command+` 前进和后退:command+control+ → 或 ← 折叠代码块:command+option+ → 或
不管时一个手指还是多个手指,轻击操作都会使每个触摸对象的tapCount加1,由于上面的例子不需要知道具体触摸对象的位置或时间等,因此可以直接调用touches的anyObject方法来获取任意一个触摸对象然后判断其...轻击操作很容易引起歧义,比如当用户点了一次之后,并不知道用户是想单击还是只是双击的一部分,或者点了两次之后并不知道用户是想双击还是继续点击。为了解决这个问题,一般可以使用“延迟调用”函数。...:@selector(setBackground:) withObject:[UIColor blueColor] afterDelay:2]; self.view.backgroundColor... = [UIColor redColor]; } } 上面代码表示在第一次轻击之后,没有直接更改视图的背景属性,而是通过performSelector:withObject:afterDelay...:方法设置2秒中后更改。
而输入源又可以分为:NSPort/自定义源/performSelector,我们常用搭到的performSelector方法有: // 主线程 performSelectorOnMainThread:withObject...onThread:withObject:waitUntilDone: performSelector:onThread:withObject:waitUntilDone:modes: /// 针对当前线程...performSelector:withObject:afterDelay: performSelector:withObject:afterDelay:inModes: /// 取消...:(SEL)aSelector; - (id)performSelector:(SEL)aSelector withObject:(id)object; - (id)performSelector:(SEL...image.png 3.3 TableView中实现平滑滚动延迟加载图片 顺带提一下,这个我在开发中没有用到。
; } return 0; } 有Runloop后,程序就相当于一直在做循环 在这个循环内部不断地处理各种任务(比如Source、Timer、Observer) int main(int...接收系统事件的内部Mode,通常用不到 GSEventReceiveRunLoopMode CFRunLoopTimerRef CFRunLoopTimerRef是基于时间的触发器 CFRunLoopTimerRef...withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray *)modes...; */ // 指定模式下进行特定的操作 [self.imageView performSelector:@selector(setImage:) withObject:[UIImage...imageNamed:@"rightPic"] afterDelay:2.0 inModes:@[NSDefaultRunLoopMode]]; } 常驻线程: 默认情况下,一个线程只能使用一次,也就是只能执行一个操作
一个线程中任务的执行是串行的 如果要在一个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务 也就是说,在同一时间内,一个线程只能执行一个任务 比如在一个线程中下载三个文件(分别是文件A、文件B...延时执行 可以使用NSObject方法,该方法通常在哪个线程调用,就在哪个线程执行,一般是主线程 [self performSelector:@selector(run) withObject:nil...[self performSelector:@selector(runA) withObject:nil afterDelay:2.0]; } - (void)onBtnClicked { //在异步函数中执行...:@selector(runB) withObject:nil afterDelay:1.0]; }); NSLog(@"异步函数"); } - (void)runA { NSLog(@"...好吧..后面再研究一下RunLoop原理… dispatch_async(queue, ^{ [self performSelector:@selector(runB) withObject
~/Library/MobileDevice/Provisioning Profiles 4.关于Xcode的Archives列表管理问题 我们在Xcode的账户中登录完一个帐户后,Archives一个工程后就会出现...的总结 线程无关方法 - (id)performSelector:(SEL)aSelector; - (id)performSelector:(SEL)aSelector withObject:(id...)object; - (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2; 这三个方法,...Delayed perform - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval...)delay inModes:(NSArray *)modes; - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay
领取专属 10元无门槛券
手把手带您无忧上云