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

2025-05-29 0 66

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

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

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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 IOS多线程编程NSThread的使用方法 https://www.kuaiidc.com/90078.html

相关文章

发表评论
暂无评论