KRISKEE'S BLOG[GO]

浅谈多线程——NSThread

  上一篇文章中我们大致了解了GCD的模式和方法,在iOS开发中除了GCD之外,还有NSThread和NSOperation两种多线程方式。

  1.NSThread

  - a - 使用NSThread开辟多线程进行子任务处理:类方法和初始化方法

  使用类方法不需要创建对象就可以直接开辟多线程并发;而创建NSThread对象进行开辟则需要使用 - (void)start 方法进行线程启动。

 1 #import "ViewController.h"
 2 
 3 typedef NS_ENUM(NSInteger, ENSThreadType) {
 4     kNSThreadClassFunc,
 5     kNSThreadInitFunc,
 6 };
 7 
 8 @interface ViewController ()
 9 
10 @end
11 
12 @implementation ViewController
13 
14 - (void)viewDidLoad {
15     [super viewDidLoad];
16     
17     [self threadWithType:kNSThreadInitFunc times:10];
18     
19 }
20 
21 - (void)threadWithType:(ENSThreadType)type times:(int)time{
22     for(int i = 0; i < time; i++){
23         NSString *str = [NSString stringWithFormat:@"测试+%d", i];
24         
25         switch (type) {
26             case kNSThreadClassFunc:{
27                 // ①类方法
28                 [NSThread detachNewThreadSelector:@selector(func:) toTarget:self withObject:str];
29             }
30                 break;
31             case kNSThreadInitFunc:{
32                 // ②初始化方法
33                 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(func:) object:str];
34                 thread.name = str;
35                 [thread start];
36             }
37                 break;
38             default:
39                 break;
40         }
41         
42     }
43 }
44 
45 - (void)func:(NSString*)str{
46     NSLog(@"%@ %@", str, [NSThread currentThread]);
47 }
48 
49 @end

  

  - b - NSThread实例方法,创建了NSThread对象后,可以调用它的实例方法:

 1 #import "ViewController.h"
 2 
 3 typedef NS_ENUM(NSInteger, ENSThreadObjFunc) {
 4     // kThreadObjFuncThread,
 5     kThreadObjFuncMain,
 6     kThreadObjFuncBackground,
 7 };
 8 
 9 @interface ViewController ()
10 {
11     NSThread *aThread;
12 }
13 @end
14 
15 @implementation ViewController
16 
17 - (void)viewDidLoad {
18     [super viewDidLoad];
19     
20     aThread = [[NSThread alloc] initWithTarget:self selector:@selector(func:) object:@"测试参考线程"];
21     [aThread start];
22     
23     [self threadObjFuncWithType:kThreadObjFuncMain thread:aThread times:10];
24     
25 }
26 
27 - (void)func:(NSString*)str{
28     NSLog(@"%@ %@", str, [NSThread currentThread]);
29 }
30 
31 - (void)threadObjFuncWithType:(ENSThreadObjFunc)type thread:(NSThread*)thread times:(int)time{
32     
33     for(int i = 0; i < time; i ++){
34         switch (type) {
35             case kThreadObjFuncMain:{
36                 // ①主线程队列中执行,同步
37                 NSString *str = [NSString stringWithFormat:@"主线程队列+%d", i];
38                 [self performSelectorOnMainThread:@selector(func:) withObject:str waitUntilDone:YES];
39             }
40                 break;
41             case kThreadObjFuncBackground:{
42                 // ②后台执行,并行异步
43                 NSString *str = [NSString stringWithFormat:@"后台执行+%d", i];
44                 [self performSelectorInBackground:@selector(func:) withObject:str];
45             }
46                 break;
47             // case kThreadObjFuncThread:{
48                 // ③在某一线程队列执行,类似于串行异步
49                 // NSString *str = [NSString stringWithFormat:@"方法+%d", i];
50                 // [self performSelector:@selector(func:) onThread:thread withObject:str waitUntilDone:YES];
51             // }
52                 // break;
53             default:
54                 break;
55         }
56     }
57 }
58 
59 @end

 

posted @ 2016-04-08 15:00  Kriskee  阅读(206)  评论(0编辑  收藏  举报