文档章节

PerformSelector:onThread:withObject:waitUntilDone理解

xiaobai1315
 xiaobai1315
发布于 2017/04/27 14:31
字数 301
阅读 16
收藏 0
点赞 0
评论 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
博文 187
码字总数 78251
作品 0
程序员
iOS OS X 和 iOS 中的多线程技术-2 (performSelectors)

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

石虎132 ⋅ 2017/11/25 ⋅ 0

iOS多线程编程之基础

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

石头2017 ⋅ 2015/10/19 ⋅ 0

iOS开发多线程篇—线程间的通信

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

卡奇匠 ⋅ 2016/03/19 ⋅ 0

iOS之[多线程:NSThread]

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

言筱羽 ⋅ 2015/11/23 ⋅ 0

IOS开发网络第一天之06线程之间的通信

#import "ViewController.h" @interface ViewController () //和storyBoard关联 @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation ViewController - (vo......

鹿微微鹿 ⋅ 2016/04/25 ⋅ 0

iOS - performSelector方法的使用

一。举例说明 [self performSelectorOnMainThread:@selector(RefreshCellForLiveId:) withObject:userinfo waitUntilDone:YES]; 该方法的作用是在主线程中,执行制定的方法(代码块)。 参数...

水一样的人儿 ⋅ 2015/12/30 ⋅ 0

ios 重温多线程 总结

1>无论使用哪种方法进行多线程开发,每个线程启动后并不一定立即执行相应的操作,具体什么时候由系统调度(CPU空闲时就会执行)。 2>更新UI应该在主线程(UI线程)中进行,并且推荐使用同步调...

那条鱼 ⋅ 2016/03/17 ⋅ 0

performSelector 和NSTimer使用注意事项

一、performSelectorXXX之类的方法 1、performSelectorOnMainThread:withObject:waitUntilDone: 在主线程上执行指定的方法,使用默认的模式(NSDefaultRunLoopMode)。 默认的模式指:主线程...

朝雨晚风 ⋅ 2016/08/16 ⋅ 0

多线程的底层实现机制

1.多线程的底层实现 (1)首先回答什么是线程 1个进程要想执行任务,必须得有线程.线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 (2)什么是多线程 1个进程中可以开...

万能的匹诺曹 ⋅ 2016/06/22 ⋅ 0

iOS开发 多线程(二) NSThread的使用(转)

每个iOS应用程序都有个专门用来更新显示UI界面、处理用户的触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来极坏的用户体验。一般...

神补刀 ⋅ 2015/08/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA入门,配置文件的设置

<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http......

码农屌丝 ⋅ 18分钟前 ⋅ 0

Java基础——面向对象和构造器

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 静态成员介绍 为什么要有静态成员?静态成员用来...

凯哥学堂 ⋅ 20分钟前 ⋅ 0

vmware中Centos 7 linux的LVM磁盘扩容

系统是RHEL7(centos7差不多一样) 关闭系统,在vmware、设置、硬盘、扩展、输入数字大于当前系统内存、点击扩展。 开机再查看磁盘信息 fdisk -l 注意:可以看出sda磁盘增加了,但是根目录还...

gugudu ⋅ 30分钟前 ⋅ 0

JAVA线程sleep和wait方法区别

昨天面试,突然被问到sleep 和 wait的区别,一下子有点蒙,在这里记一下,以示警戒。 首先说sleep,sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过去后,cpu...

徐玉强 ⋅ 32分钟前 ⋅ 0

vuex学习--模块

随着项目复杂性增加,共享状态也越来越多。需要对转态操作进行分组,分组后在进行分组编写。学习一下module:状态管理器的模块组操作。 首先是声明: const moduleA={ state,mutations,g...

大美琴 ⋅ 35分钟前 ⋅ 0

Selenium 简单入门

安装 pip install selenium 驱动下载 https://chromedriver.storage.googleapis.com/index.html 下载最新的驱动,放入path中,可以放入Python的scripts目录下,也可以放入Chrome安装目录,并...

阿豪boy ⋅ 36分钟前 ⋅ 0

292. Nim Game - LeetCode

Question 292. Nim Game Solution 思路:试着列举一下,就能发现一个n只要不是4的倍数,就能赢。 n 是否能赢1 true2 true3 true4 false 不论删除几,对方都能一把赢5 t...

yysue ⋅ 今天 ⋅ 0

6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩

zip压缩工具 zip命令可以压缩目录和文件,-r 压缩目录。 zip使用方法 zip 1.txt.zip 1.txt //压缩文件 zip -r 123.zip 123/ //压缩目录 unzip 1.txt.zip //解压 unzip 123.zip -d /root/456...

Linux_老吴 ⋅ 今天 ⋅ 0

react-loadable使用跳坑

官方给react-loadable的定义是: A higher order component for loading components with dynamic imports. 动态路由示例 withLoadable.js import React from 'react'import Loadable fro......

pengqinmm ⋅ 今天 ⋅ 0

记录工作中遇到的坑

1、ios safari浏览器向下滚动会触发window resize事件

端木遗风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部