欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-02-11 23:41:10
ios多线程编程nsthread的使用方法 nsthread是多线程的一种,有两种方法创建子线程 (1)优点:nsthread 比gcd、nsoperation都轻...

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多线程编程NSThread的使用方法

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