如题,这是最近在修改一个数据同步模块时发现的问题。整个数据同步的任务是在App启动后放在一个后台执行的线程中的,执行某个单条数据同步任务成功后,会使用
[self performSelector:(nonnull SEL) withObject:(nullable id) afterDelay:(NSTimeInterval)];
来执行下一个单条数据同步任务。通过调试,发现在执行到这行代码的时候,并没有调用 SEL 的方法。在确定存在这个方法后,一直没有想到原因,于是就谷歌之。答案就是,performSelector withObject afterDelay 方法在子线程中,并不会调用SEL方法,而 performSelector withObject 方法会直接调用。原因在于一下两点:
1、afterDelay方式是使用当前线程的定时器在一定时间后调用SEL,NO AfterDelay方式是直接调用SEL。
2、子线程中默认是没有定时器的。
所以,针对问题的解决方法也有两种:
1、开启线程的定时器
[[NSRunLoop currentRunLoop] run];
2、使用dispatch_after来执行定时任务
- (void)functionToDelay:(SEL)function param:(nullable id)param afterDelay:(NSTimeInterval)delay { dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, delay*NSEC_PER_SEC); dispatch_after(time, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ if ([self respondsToSelector:function]) { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-performSelector-leaks" [self performSelector:function withObject:param]; #pragma clang diagnostic pop } }); }
相关推荐
- `-[NSObject performSelector:]`是最简单的形式,接收一个SEL参数,用于在当前对象上调用对应的方法。 - `-[NSObject performSelector:withObject:]`可以传递一个参数到方法中。 - `-[NSObject performSelector...
例如,在`YYViewController.m`的`viewDidLoad`方法中,我们看到`[self performSelector:@selector(run) withObject:nil afterDelay:2.0];`这行代码,它会在2秒后调用`run`方法。需要注意的是,如果当前线程是主线程...
创建线程的方法有使用NSThread类、POSIX线程API以及NSObject的performSelector:withObject:afterDelay:方法。线程属性包括堆栈大小和线程本地存储,开发者可以根据需要配置。 线程管理包括编写线程的主体入口点,...
- `performSelector:withObject:afterDelay:inModes:` - 延迟并在特定RunLoop模式下执行 selector。 理解并熟练运用这些方法,能够帮助开发者编写出高效、流畅的应用程序。在实际项目中,还需要结合GCD(Grand ...
有时我们希望在未来的某个时刻执行某个操作,这时可以使用`performSelector:withObject:afterDelay:`方法。这个方法接受一个选择器、一个参数(如果有的话)和一个延迟时间,然后在指定的时间后执行对应的方法。 4...
3. **performSelector:withObject:afterDelay:** - 这是Objective-C中的一个简单延时执行方法,适用于单次不重复的任务。方法会在指定秒数后调用指定的方法。 - 注意,由于内存管理机制,如果调用的对象在延时期间...
3. **延迟执行**:`- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;` 4. **回到主线程执行**:`- (void)performSelectorOnMainThread:(SEL)...
- 延时执行代码,可以使用`performSelector:withObject:afterDelay:`,或者GCD的`dispatch_after`。 这些都是iOS面试中常见的技术问题,深入理解并能够熟练应用这些知识点将有助于在面试中表现出色。同时,还需要...
在iOS开发领域,面试题...- 延时执行:可以使用`performSelector:withObject:afterDelay:`或者GCD的`dispatch_after`。 以上是iOS面试中可能会遇到的一些基础问题和解答,掌握这些知识点对于iOS开发者来说至关重要。
前言 在开发过程中,我们有时会希望把一些操作封装起来延迟一段时间后再执行。... [self performSelector:@selector(delayDo:) withObject:nil afterDelay:1.0f]; //带参数 [self performSelector:@selector(delayD
NSObject.performSelector(#selector(delayedAction), withObject: nil, afterDelay: 2.0) ``` 这将在2秒后调用`delayedAction`。此方法简单易用,但可能引发安全问题,如未声明的方法选择器或者在对象销毁后仍...
另一种是使用NSInvocation对象来手动设置方法的selector、目标、参数等,并通过performSelector:withObject:afterDelay:调用invocation对象的invoke方法,从而实现延迟调用多参数方法。 再来看数据类型的比较,包括...
通过调用`performSelector:withObject:afterDelay:`,我们可以指定一个方法在给定的时间延迟后执行。需要注意的是,此方法必须在主线程中调用,否则不会生效。由于其非阻塞特性,程序会继续运行,但一旦调度,就无法...
[self performSelector:@selector(loadView) withObject:nil afterDelay:3.0]; ``` 这种方法简单易用,但需要注意的是,如果对象在延迟时间到达之前被释放,那么延迟的操作将不会执行。 2. **NSTimer** `NSTimer` ...
使用`runUntilDate:`或`performSelector:withObject:afterDelay:`阻塞线程并响应事件。 24. **数据持久化**:iOS常用CoreData(对象图形管理系统)、SQLite(关系型数据库)、plist、JSON等方式。CoreData非严格...
- **延迟执行**:使用`dispatch_after`或`performSelector:withObject:afterDelay:`可以使用Block实现延迟执行。 - **过滤和映射数据**:在数组和集合操作中,Block可以作为参数用于过滤(filter)、映射(map)等...
- **延时执行代码**:可以使用`performSelector:withObject:afterDelay:`方法来实现延时执行代码。此方法允许你指定延迟的时间以及要执行的方法。 #### 八、浅复制与深复制 **问题**:浅复制和深复制的区别? **...
首先,我们来看一个简单的示例,这个例子中的`viewDidLoad`方法中调用了`performSelector:withObject:afterDelay:`来延迟执行`wangmumu:`方法。这个方法内部使用了`dispatch_once`来确保`NSLog(@"12345678910")`这段...