文档章节

PerformSelector:onThread:withObject:waitUntilDone理解

xiaobai1315
 xiaobai1315
发布于 2017/04/27 14:31
字数 301
阅读 24
收藏 0

 

performSelector:onThread:withObject:waitUntilDone理解

直接看代码

//
//  ViewController.m
//  RunLoopDemo
//

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic, assign) BOOL isAborted;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self threadInfo:@"UI"];

    _isAborted = NO;
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(newThread:) object:nil];
    [thread start];
//    When performing a selector on another thread, the target must have an active run loop
    [self performSelector:@selector(test:) onThread:thread withObject:nil waitUntilDone:NO];
}

- (void)newThread:(id)obj {
    @autoreleasepool {
        NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop];
        while (!_isAborted) {
            [currentRunLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
        }
        NSLog(@"线程停止");
    }
}

- (void)test:(id)obj {
    [self threadInfo:@"test"];
    _isAborted = YES;
}

- (void)threadInfo:(NSString *)info {
    NSLog(@"%@--%@", info, [NSThread currentThread]);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

@end

有的人无法理解为什么要通过[self performSelector:@selector(test:) onThread:thread withObject:nil waitUntilDone:NO];中的test:方法来更新_isAborted状态。为什么不在[thread start]之后直接调用。原因其实是这里通过selector方法将其设置成yes的原因是虽然设置为yes,但是这时候runloop所在的线程其实是并不知道_isNewThreadAborted被重新赋值了。runloop没有被任务事件唤醒。所以正确的方法是通过使用selector来唤醒Runloop。 并且要注意,在执行performSelector:onThread:withObject:waitUntilDone方法时候,如果是在另外一个线程执行,必须保证另外的线程是有一个runloop.具体的使用可以参考AFNetworking.

本文转载自:http://www.jianshu.com/p/d27200c75848

共有 人打赏支持
xiaobai1315
粉丝 3
博文 199
码字总数 60377
作品 0
程序员
iOS OS X 和 iOS 中的多线程技术-2 (performSelectors)

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、performSelectors(执行选择器) NSObject 提供了以 performSelector 为前缀的一系列方法。它们可以让用户在指定线程中,或者立即,或者延迟...

石虎132
2017/11/25
0
0
iOS多线程编程之基础

多线程是为了解决主线程被阻塞,并提高效率的一种方式. 首先我们要学习多线程编程就要看看它有哪几种方式: NSThread NSOperation Grand Centeral Dispatch 我们看看NSThread的创建方式:: NSTh...

石头2017
2015/10/19
59
0
iOS开发多线程篇—线程间的通信

一、简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后,转到另1个线程...

卡奇匠
2016/03/19
44
0
iOS文档补完计划--NSObject

目录 NSObject类 类的初始化 创建、复制和销毁 类/对象的识别与判等 类/对象的测试 获取方法信息 类/对象的描述 发送消息 动态解析(消息转发) Weak相关 NSObject类/NSObject协议 几乎所有O...

kirito_song
08/26
0
0
iOS之[多线程:NSThread]

1.线程的三种状态 2.创建新线程 将操作添加到线程中并直接启动 创建一个线程对象,然后调用start方法启动线程 3.线程控制 3.1启动线程 3.2取消线程,可以在线程外部使用 3.3结束当前线程,写...

言筱羽
2015/11/23
48
0

没有更多内容

加载失败,请刷新页面

加载更多

利用碎片化时间Get Linux系统

起初,我做着一份与IT毫无关系的工作,每月领着可怜的工资,一直想改变现状,但无从下手,也就是大家熟知的迷茫。我相信,每一个人都会或多或少的经历过迷茫,迷茫每一个选择,迷茫工作或者生...

linuxprobe16
今天
5
0
OSChina 周日乱弹 —— 恨不得给你买张飞机挂票

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @开源中国首席灵魂师:分享张希/曹方的单曲《认真地老去》 来不及认真的年轻过,就认真的老去! 《认真地老去》- 张希/曹方 手机党少年们想听...

小小编辑
今天
281
6
如何实现靠谱的分布式锁?

分布式锁,是用来控制分布式系统中互斥访问共享资源的一种手段,从而避免并行导致的结果不可控。基本的实现原理和单进程锁是一致的,通过一个共享标识来确定唯一性,对共享标识进行修改时能够...

郑加威
今天
3
0
Mac OS X下Maven的安装与配置

Mac OS X 安装Maven: 下载 Maven, 并解压到某个目录。例如/Users/robbie/apache-maven-3.3.3 打开Terminal,输入以下命令,设置Maven classpath $ vi ~/.bash_profile 添加下列两行代码,之后...

TonyStarkSir
今天
5
0
关于编程,你的练习是不是有效的?

最近由于工作及Solution项目的影响,我在重新学习DDD和领域建模的一些知识。然后,我突然就想到了这个问题,以及我是怎么做的? 对于我来说,提升技能的项目会有四种: 纯兴趣驱动的项目。即...

问题终结者
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部