`
3lll
  • 浏览: 67986 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

(原创)performSelector withObject afterDelay 在子线程上调用不运行

阅读更多

    如题,这是最近在修改一个数据同步模块时发现的问题。整个数据同步的任务是在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

        }
    });   
}

 

0
1
分享到:
评论

相关推荐

    OC-performSelector

    - `-[NSObject performSelector:]`是最简单的形式,接收一个SEL参数,用于在当前对象上调用对应的方法。 - `-[NSObject performSelector:withObject:]`可以传递一个参数到方法中。 - `-[NSObject performSelector...

    IOS多线程之GCD(3) - iOS知识库1

    例如,在`YYViewController.m`的`viewDidLoad`方法中,我们看到`[self performSelector:@selector(run) withObject:nil afterDelay:2.0];`这行代码,它会在2秒后调用`run`方法。需要注意的是,如果当前线程是主线程...

    IOS 多线程

    创建线程的方法有使用NSThread类、POSIX线程API以及NSObject的performSelector:withObject:afterDelay:方法。线程属性包括堆栈大小和线程本地存储,开发者可以根据需要配置。 线程管理包括编写线程的主体入口点,...

    OC-performSelectorInBackground

    - `performSelector:withObject:afterDelay:inModes:` - 延迟并在特定RunLoop模式下执行 selector。 理解并熟练运用这些方法,能够帮助开发者编写出高效、流畅的应用程序。在实际项目中,还需要结合GCD(Grand ...

    ios-自定义选择器.zip

    有时我们希望在未来的某个时刻执行某个操作,这时可以使用`performSelector:withObject:afterDelay:`方法。这个方法接受一个选择器、一个参数(如果有的话)和一个延迟时间,然后在指定的时间后执行对应的方法。 4...

    iOS定时器Demo

    3. **performSelector:withObject:afterDelay:** - 这是Objective-C中的一个简单延时执行方法,适用于单次不重复的任务。方法会在指定秒数后调用指定的方法。 - 注意,由于内存管理机制,如果调用的对象在延时期间...

    IOS多线程编程NSThread的使用方法

    3. **延迟执行**:`- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;` 4. **回到主线程执行**:`- (void)performSelectorOnMainThread:(SEL)...

    iOS面试题-iOS部分

    - 延时执行代码,可以使用`performSelector:withObject:afterDelay:`,或者GCD的`dispatch_after`。 这些都是iOS面试中常见的技术问题,深入理解并能够熟练应用这些知识点将有助于在面试中表现出色。同时,还需要...

    IOS部分面试题

    在iOS开发领域,面试题...- 延时执行:可以使用`performSelector:withObject:afterDelay:`或者GCD的`dispatch_after`。 以上是iOS面试中可能会遇到的一些基础问题和解答,掌握这些知识点对于iOS开发者来说至关重要。

    iOS中延时执行的几种方式比较及汇总

    前言 在开发过程中,我们有时会希望把一些操作封装起来延迟一段时间后再执行。... [self performSelector:@selector(delayDo:) withObject:nil afterDelay:1.0f];  //带参数 [self performSelector:@selector(delayD

    DelayTest.zip

    NSObject.performSelector(#selector(delayedAction), withObject: nil, afterDelay: 2.0) ``` 这将在2秒后调用`delayedAction`。此方法简单易用,但可能引发安全问题,如未声明的方法选择器或者在对象销毁后仍...

    多年iOS开发经验总结

    另一种是使用NSInvocation对象来手动设置方法的selector、目标、参数等,并通过performSelector:withObject:afterDelay:调用invocation对象的invoke方法,从而实现延迟调用多参数方法。 再来看数据类型的比较,包括...

    对比分析iOS延迟执行的4种方式

    通过调用`performSelector:withObject:afterDelay:`,我们可以指定一个方法在给定的时间延迟后执行。需要注意的是,此方法必须在主线程中调用,否则不会生效。由于其非阻塞特性,程序会继续运行,但一旦调度,就无法...

    iOS 延迟加载

    [self performSelector:@selector(loadView) withObject:nil afterDelay:3.0]; ``` 这种方法简单易用,但需要注意的是,如果对象在延迟时间到达之前被释放,那么延迟的操作将不会执行。 2. **NSTimer** `NSTimer` ...

    iOS 常见面试题

    使用`runUntilDate:`或`performSelector:withObject:afterDelay:`阻塞线程并响应事件。 24. **数据持久化**:iOS常用CoreData(对象图形管理系统)、SQLite(关系型数据库)、plist、JSON等方式。CoreData非严格...

    ios-block理解.zip

    - **延迟执行**:使用`dispatch_after`或`performSelector:withObject:afterDelay:`可以使用Block实现延迟执行。 - **过滤和映射数据**:在数组和集合操作中,Block可以作为参数用于过滤(filter)、映射(map)等...

    IOS 职位面试问题及答案

    - **延时执行代码**:可以使用`performSelector:withObject:afterDelay:`方法来实现延时执行代码。此方法允许你指定延迟的时间以及要执行的方法。 #### 八、浅复制与深复制 **问题**:浅复制和深复制的区别? **...

    iOS实现代码只执行一次

    首先,我们来看一个简单的示例,这个例子中的`viewDidLoad`方法中调用了`performSelector:withObject:afterDelay:`来延迟执行`wangmumu:`方法。这个方法内部使用了`dispatch_once`来确保`NSLog(@"12345678910")`这段...

Global site tag (gtag.js) - Google Analytics