文档章节

PerformSelector:onThread:withObject:waitUntilDone理解

xiaobai1315
 xiaobai1315
发布于 2017/04/27 14:31
字数 301
阅读 31
收藏 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
博文 202
码字总数 62090
作品 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
多线程

举例说明怎么简单的创建一个子线程。 用到的类是NSThread类,这里使用detachNewTheadSelector:toTagaet:withObject创建一个线程。 函数setupThread:(NSArray*)userInfor。通过userInfor将需要...

长平狐
2012/08/13
138
0
iOS文档补完计划--NSObject

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

kirito_song
08/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么要学习Python?这10个理由足够了!

摘要: 看完这十个理由,我决定买本python从入门到精通! 如果你定期关注现今的科技发展,那么你可能想知道我为什么要写这篇文章告诉人们学习Python?因为几年前我提倡Java而不是Python。 在...

阿里云官方博客
16分钟前
1
0
spring服务方式配置okhttp3

问题 如果把OKhttp以Spring服务方式配置,就解决了从配置中心运行时刷新配置参数的问题。 OkHttpConfig.java package com.zyl.config;import okhttp3.OkHttpClient;import org.springfra...

亚林瓜子
17分钟前
2
0
8张图让你一步步看清 async/await 和 promise 的执行顺序

**摘要:**面试必问 原文:8张图帮你一步步看清 async/await 和 promise 的执行顺序 作者:ziwei3749 Fundebug经授权转载,版权归原作者所有。 为什么写这篇文章? 说实话,关于js的异步执行顺...

Fundebug
18分钟前
1
0
Linux 命令菜单

#!/bin/bash #menu.sh menu(){ source ~/.bashrc echo "=================================" echo "Please enter your choise:" echo "(0) Kill all java" echo "(1) Start all tomcat" echo......

mellen
23分钟前
3
0
原来云数据库也是有思想的...

本文由一刻talks发表 邵宗文,腾讯云数据库专家副总监。十余年数据库从业经验,2009年加入腾讯,曾负责腾讯网,新闻客户端,快报,视频,财经,体育等数据库平台部署、规划及运维支持工作。本...

腾讯云加社区
24分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部