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

 更新时间:2017年10月11日 10:16:32   作者:番薯大佬  
这篇文章主要介绍了IOS多线程编程NSThread的使用方法的相关资料,希望通过本文能帮助到大家,让大家理解使用多线程的方法,需要的朋友可以参考下

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

NSThread是多线程的一种,有两种方法创建子线程

(1)优点:NSThread 比GCD、NSOperation都轻量级

(2)缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销

第一种是隐藏创建,有以下几种方式:

(1)多用于串行:- (id)performSelector:(SEL)aSelector withObject:(id)object;
(2)后台执行,多用于并行:- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg;
(3)延迟执行:- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;
(4)回到主线程执行:- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
注意:
(1)通过方法" + (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument; ",或"+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget"停止执行; 

示例:

//创建子线程-隐式方法

// 子线程-串行 
[self performSelector:@selector(showCount:) withObject:@(11)]; 
[self performSelector:@selector(showCount:) withObject:@(12)]; 
[self performSelector:@selector(showCount:) withObject:@(23)]; 

// 子线程-并行(后台)  
[self performSelectorInBackground:@selector(showCount:) withObject:@(41)]; 
[self performSelectorInBackground:@selector(showCount:) withObject:@(42)]; 
// 回到主线程 
[self performSelectorOnMainThread:@selector(showCount:) withObject:@(51) waitUntilDone:YES]; 

// 子线程延迟执行 
[self performSelector:@selector(showCount:) withObject:@(61) afterDelay:5.0]; 
// 停止 
[NSObject cancelPreviousPerformRequestsWithTarget:self]; 

 第二种是显示创建,方式如下:

 - (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument; 

注意:

 (1)通过方法" - (void)start; "开始执行;
 (2)通过方法" - (void)cancel; "停止执行;  

 示例:

 //创建子线程-显示方法

self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(showCount:) object:@(61)]; 
self.thread.name = @"计数"; 
[self.thread start]; 
[self.thread cancel]; 

代码示例

- (void)showCount:(NSNumber *)number 
{ 
 NSInteger count = arc4random() % 1000; 
 count = 1000; 
 for (int i = 0; i < count; i++) 
 { 
  NSLog(@"第 %@ 个 i = %@", number, @(i)); 
   
  // 休眠n秒再执行 
  [NSThread sleepForTimeInterval:0.2]; 
   
  // 停止 
//  BOOL isStop = [self.thread isCancelled]; 
//  if (isStop) 
//  { 
//   NSLog(@"2 停止"); 
//   break; 
//  } 
  if (isCancelThread) 
  { 
   NSLog(@"2 停止"); 
   break; 
  } 
 } 
} 
bool isCancelThread = NO; 
- (void)stopClick 
{ 
 [NSObject cancelPreviousPerformRequestsWithTarget:self]; 
  
 if (self.thread) 
 { 
  BOOL isExecuting = [self.thread isExecuting]; 
  if (isExecuting) 
  { 
   NSLog(@"1 停止"); 
//   [self.thread cancel]; 
   isCancelThread = YES; 
  } 
 } 
} 
- (void)downloadImage:(NSString *)imageUrl 
{ 
 NSURL *url = [NSURL URLWithString:imageUrl]; 
 NSData *data = [[NSData alloc] initWithContentsOfURL:url]; 
 UIImage *image = [[UIImage alloc] initWithData:data]; 
 if (image == nil) 
 { 
   
 } 
 else 
 { 
//  [self performSelectorOnMainThread:@selector(updateImage:) withObject:image waitUntilDone:YES]; 
  [self performSelectorInBackground:@selector(updateImage:) withObject:image]; 
 } 
  
// NSURL *url = [NSURL URLWithString:imageUrl]; 
// NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
// NSURLSession *session = [NSURLSession sharedSession]; 
// NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error) { 
//   
//  // 输出返回的状态码,请求成功的话为200 
//  NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; 
//  NSInteger responseStatusCode = [httpResponse statusCode]; 
//  NSLog(@"%ld", responseStatusCode); 
//   
//  UIImage *image = [UIImage imageWithData:data]; 
////  [self performSelectorOnMainThread:@selector(updateImage:) withObject:image waitUntilDone:YES]; 
//  [self performSelectorInBackground:@selector(updateImage:) withObject:image]; 
// }]; 
//  
// // 使用resume方法启动任务 
// [dataTask resume]; 
} 
- (void)updateImage:(UIImage *)image 
{ 
 self.imageview.image = image; 
  
// self.imageview = [[UIImageView alloc] initWithFrame:CGRectMake(10.0, 10.0, (CGRectGetWidth(self.view.bounds) - 10.0 * 2), (CGRectGetWidth(self.view.bounds) - 10.0 * 2))]; 
// [self.view addSubview:self.imageview]; 
// self.imageview.backgroundColor = [UIColor colorWithWhite:0.5 alpha:0.2]; 
//  
// self.imageview.image = image; 
} 
NSString *imageUrl = @"http://ww1.sinaimg.cn/crop.0.0.1242.1242.1024/763fb12bjw8empveq3eq8j20yi0yiwhw.jpg"; 
// 隐藏创建 
// [self performSelectorInBackground:@selector(downloadImage:) withObject:imageUrl]; 
[self performSelectorOnMainThread:@selector(downloadImage:) withObject:imageUrl waitUntilDone:YES]; 
// 创建子线程-显示方法 
self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(downloadImage:) object:imageUrl]; 
self.thread.name = @"imageDownload"; 
[self.thread start]; 

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • IOS 通讯录信息读取兼容的实现方法

    IOS 通讯录信息读取兼容的实现方法

    这篇文章主要介绍了IOS 通讯录信息读取兼容的实现方法的相关资料,这里提供实现方法帮助大家实现这样的功能,需要的朋友可以参考下
    2017-08-08
  • iOS中的表单按钮选项UIActionSheet常用方法整理

    iOS中的表单按钮选项UIActionSheet常用方法整理

    UIActionSheet经常被用来制作各种弹出的选项,这里我们就来看一下iOS中的表单按钮选项UIActionSheet常用方法整理,需要的朋友可以参考下
    2016-06-06
  • iOS app中无网络页面的添加方法详解

    iOS app中无网络页面的添加方法详解

    这篇文章主要给大家介绍了关于iOS app中无网络页面的添加方法的相关资料,通过文中提供的方法可以很方便的给大家进行提供一个提醒,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2018-01-01
  • 如何去掉Xcode工程中某种类型的警告

    如何去掉Xcode工程中某种类型的警告

    这篇文章主要给大家介绍了关于如何去掉Xcode工程中某种类型的警告,文中通过示例代码介绍的非常详细,对大家学习或者使用Xcode具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • iOS中UIAlertView警告框组件的使用教程

    iOS中UIAlertView警告框组件的使用教程

    需要注意的是在IOS8之后,UIAlertView和UIActionSheet这两个控件被UIAlertController代替,但是这两个控件依然可以使,下面我们就简单了解一下iOS中UIAlertView警告框组件的使用教程
    2016-05-05
  • iOS中TableView如何统一数据源代理详解

    iOS中TableView如何统一数据源代理详解

    这篇文章主要给大家介绍了关于iOS中TableView如何统一数据源代理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-07-07
  • IOS开发代码分享之用nstimer实现倒计时功能

    IOS开发代码分享之用nstimer实现倒计时功能

    在制作IOS项目中,我们经常要用到倒计时功能,今天就分享下使用nstimer实现的倒计时功能的代码,希望对大家能有所帮助
    2014-09-09
  • iOS中类似微信红点显示功能

    iOS中类似微信红点显示功能

    ios中类似微信红点显示功能,设计思路非常简单,给UIView增加一个分类 所有的视图都可以根据需要来进行红点显示。下面通过实例代码看下实现方法吧
    2016-12-12
  • iOS开发中CAlayer层的属性以及自定义层的方法

    iOS开发中CAlayer层的属性以及自定义层的方法

    这篇文章主要介绍了iOS开发中CAlayer层的属性以及自定义层的方法,代码基于传统的Objective-C,需要的朋友可以参考下
    2015-11-11
  • 总结iOS中runtime的使用

    总结iOS中runtime的使用

    iOS开发中的Runtime可谓是功能强大,同时Runtime使用起来也是非常灵活的,通过本文一起来学习下iOS中的runtime。
    2016-07-07

最新评论