距离年前放假还有三天,这3天就把多线程稍微整理下。
iOS常用的多线程有三种,分别是NSThread和NSOperation,以及GCD。
今天先整理一下较为简单NSThread的资料。
老规矩,提供下官方的辅助资料:
https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html
https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSThread_Class/Reference/Reference.html
关于多线程:
当你需要执行一个冗长的任务,但不希望阻止应用程序的其余部分的执行,这时候就要使用多线程。
使用多线程可以避免阻塞应用程序的主线程,从而继续来处理用户介面和事件相关的行动。
多线程可以用来将大量的工作分成几个较小的工作,从而导致用户体验的提高。
先写一个例子:
[objc]
NSLog(@"Example 1");
[self action:@"NSobject类方法"];
NSLog(@"Example End\n\n");
– (void) action:(NSString*)string
{
NSLog(@"Example = %@",string);
}
[/objc]
可以看到控制台如下输出:
[objc]
2014-01-26 16:21:09.611 test[3867:70b] Example 1
2014-01-26 16:21:09.612 test[3867:70b] Example = NSobject类方法
2014-01-26 16:21:09.612 test[3867:70b] Example End
[/objc]
接着用NSObject类方法 performSelectorInBackground: withObject: 创建一个线程:
[objc]
NSLog(@"Example 1");
[self performSelectorInBackground:@selector(action:) withObject:@"NSobject类方法"];
NSLog(@"Example End\n\n");
[/objc]
可以看到控制台如下输出:
[objc]
2014-01-26 16:21:55.762 test[3883:70b] Example 1
2014-01-26 16:21:55.763 test[3883:70b] Example End
2014-01-26 16:21:55.763 test[3883:350b] Example = NSobject类方法
[/objc]
由于这2个比较明显,我就不用再解释什么了….
附带的另一个方法,这个方法是调用主线程,用来子线程与主线程交互,
该方法的作用是在其他线程中,执行主线程制定的方法,大多数可以用于更新UI状态。
附带建议子线程内不要进行UI更新操作,也不要刷新介面。
关于方法的waitUntilDone:为YES,则需要等待这onMain执行完成后,才会执行输出Example End;
当为NO,既不管onMain是否执行完成,直接往下走,输出Example End。
[objc]
NSLog(@"Example 1.2");
[self performSelectorOnMainThread:@selector(onMain) withObject:self waitUntilDone:YES];
NSLog(@"Example End\n\n");
– (void)onMain
{
//判断当前线程是否主线程
//YES:当前线程为主线程,NO则不是。
if ( [NSThread isMainThread]) {
NSLog(@"yes");
}else{
NSLog(@"no");
}
}
[/objc]
当waitUntilDone:为YES。输出如下:
[objc]
2014-01-26 17:01:38.508 test[4184:70b] Example 1.2
2014-01-26 17:01:38.508 test[4184:70b] yes
2014-01-26 17:01:38.509 test[4184:70b] Example End
[/objc]
接着当waitUntilDone:为NO。
[objc]
2014-01-26 17:02:12.604 test[4201:70b] Example 1.2
2014-01-26 17:02:12.605 test[4201:70b] Example End
2014-01-26 17:02:12.609 test[4201:70b] yes
[/objc]
NSThread 实现多线程,方法一:
[objc]
[NSThread detachNewThreadSelector:@selector(action:) toTarget:self withObject:@"NSThread 方法一"];
[/objc]
该方法为类方法,立即创建线程并执行action:,且无需为进程进行清理
而另一种方法,则是实例方法,需要先初始化。
虽然初始化了新NSThread,但是需要手动去启动线程。
但是对比类方法,实例方法可以在启动之前对齐线程进行设置,如名字,优先级等。
[objc]
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(action:) object:@"NSThread 方法二"];
[thread start];//启动线程
[/objc]
注意,如果你不是使用ARC的项目,哪么你需要自行管理好内存的释放。
[objc]
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[pool release];
[/objc]
由于时间关系NSThread的线程同步留着下次再整理。