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"停止执行;
示例:
//创建子线程-隐式方法
1
2
3
4
5
|
// 子线程-串行 [self performselector:@selector(showcount:) withobject:@(11)]; [self performselector:@selector(showcount:) withobject:@(12)]; [self performselector:@selector(showcount:) withobject:@(23)]; <br> |
1
2
3
|
// 子线程-并行(后台) [self performselectorinbackground:@selector(showcount:) withobject:@(41)]; [self performselectorinbackground:@selector(showcount:) withobject:@(42)]; |
1
2
3
|
// 回到主线程 [self performselectoronmainthread:@selector(showcount:) withobject:@(51) waituntildone:yes]; <br> |
1
2
|
// 子线程延迟执行 [self performselector:@selector(showcount:) withobject:@(61) afterdelay:5.0]; |
1
2
|
// 停止 [nsobject cancelpreviousperformrequestswithtarget:self]; |
第二种是显示创建,方式如下:
1
|
- (instancetype)initwithtarget:(id)target selector:(sel)selector object:(nullable id)argument; |
注意:
(1)通过方法" - (void)start; "开始执行;
(2)通过方法" - (void)cancel; "停止执行;
示例:
//创建子线程-显示方法
1
2
3
4
|
self. thread = [[nsthread alloc] initwithtarget:self selector:@selector(showcount:) object:@(61)]; self. thread .name = @ "计数" ; [self. thread start]; [self. thread cancel]; |
代码示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
- ( 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 ; } } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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; } } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
- ( 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]; } |
1
2
3
4
5
6
7
8
9
10
|
- ( 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; } |
1
2
3
4
5
6
7
8
|
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]; |
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:http://blog.csdn.net/potato512/article/details/46274123