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];
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!