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];
|
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
相关文章
- 64M VPS建站:如何选择最适合的网站建设平台? 2025-06-10
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- ASP.NET自助建站系统的数据库备份与恢复操作指南 2025-06-10
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
- 个人网站搭建:如何挑选具有弹性扩展能力的服务器? 2025-06-10
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
2025-05-25 43
-
2025-05-29 55
-
2025-05-27 64
-
2025-05-25 93
-
2025-06-04 24