当前位置: 移动技术网 > 移动技术>移动开发>IOS > IOS多线程编程NSThread的使用方法

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

2019年07月24日  | 移动技术网移动技术  | 我要评论

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]; 

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网