昨天在项目中使用到了以前所没有使用过的线程,今天有时间来简单的学习一下。
一.线程的创建分为三种方法
- (id)init; // designated initializer
- (id)initWithTarget:(id)target selector: (SEL)selector object:(id)argument;
以上两种方法创建的线程方法,需要另外调用 “start”方法来启动该线程
3.(void)detachNewThreadSelector: (SEL)aSelector toTarget: (id)aTarget withObject: (id)anArgument
而上面这种创建线程的方法,则不需要再额外调用其他方法来启动线程。
4. [selfperformSelectorInBackground:@selector(threadAction) withObject:self];
也不用调用启动方法。更多的使用县城方法,倾向于使用这种方式。
5.NSOperationQueue *operationQueue = [[NSOperationQueuealloc]init];
[operationQueue addOperationWithBlock:^{
for (int i = 0; i < 30; i++) {
NSLog(@"多线程:%d",i);
}
}];
6.
//1.线程池:这个对象可设置线程执行优先级和线程并发数(同时段执行多少线程)
NSOperationQueue *operationQueue = [[NSOperationQueuealloc]init];
[operationQueue addOperationWithBlock:^{
for (int i = 0; i < 30; i++) {
NSLog(@"多线程:%d",i);
}
}];
//设置并发数为1,线程池中同一时间只能执行一个线程
operationQueue.maxConcurrentOperationCount = 1;
NSInvocationOperation *operation1 = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(operationAction1) object:nil];
//设置线程的优先级
[operation1 setQueuePriority:NSOperationQueuePriorityLow];
NSInvocationOperation *operation2 = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(operationAction1) object:nil];
[operation2 setQueuePriority:NSOperationQueuePriorityHigh];
//把线程添加进线程池中去
[operationQueue addOperation:operation1];
[operationQueue addOperation:operation2];
二:1。暂时遇到一个说法,更新UI必须得回到主线程。
暂时我不清楚这样的原因,并且什么情况,或者说怎么使用线程方法才是回到主线程,对于我来说还是一个迷。
2。清楚的是,调用以下这个方法是回到主线程。(下面这个方法,也在很多情况下被用到,以此来回到主线程来更新UI)
用NSObject的类方法 performSelectorInBackground:withObject: 创建一个线程:
[Obj performSelectorInBackground:@selector(doSomething) withObject:nil];
三:下面这一段代码或许就是对问题二得一个合理得解释。利用一中得三类方法开得线程都不是主线程,所以在下面代码中,新开得线程方法里下载完图片之后,需要返回到主线程来更新UI。
//
// ViewController.m
// NSThreadDemo
//
// Created by rongfzh on 12-9-23.
// Copyright (c) 2012年 rongfzh. All rights reserved.
//
#import "ViewController.h"
#define kURL @"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"
@interface ViewController ()
@end
@implementation ViewController
-(void)downloadImage:(NSString *) url{
NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
UIImage *image = [[UIImage alloc]initWithData:data];
if(image == nil){
}else{
[self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
}
}
-(void)updateUI:(UIImage*) image{
self.imageView.image = image;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// [NSThread detachNewThreadSelector:@selector(downloadImage:) toTarget:self withObject:kURL];
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(downloadImage:) object:kURL];
[thread start];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end