bingoogolapple / bingoogolapple.github.io

个人主页。同时也通过 Issues 记录学习笔记
http://www.bingoogolapple.cn
86 stars 19 forks source link

NSThread #55

Open bingoogolapple opened 9 years ago

bingoogolapple commented 9 years ago

创建和启动线程的三种方式

先创建,后启动

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(download:) object:nil];
[thread start];

创建完自动启动

[NSThread detachNewThreadSelector:@selector(download:) toTarget:self withObject:nil];

隐式创建(自动启动)

[self performSelectorInBackground:@selector(download:) withObject:nil];

常见方法

获取当前线程

+(NSThread *)currentThread;

获取主线程

+(NSThread *)mainThread;

睡眠(暂停)线程

+(void)sleepUnitDeta:(NSDate *)date;
+(void)sleepForTimeInterval:(NSTimeInterval)time

设置线程的名字

-(void)setName:(NSString *)name;
-(NSString *)name;

不要同时开太多的线程(1~3条线程即可,不要超过5条)

bingoogolapple commented 9 years ago

线程间通信

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self performSelectorInBackground:@selector(download) withObject:nil];
}

/**
 *  下载图片
 */
- (void)download
{
    NSLog(@"download---%@", [NSThread currentThread]);
    // 1.图片地址
    NSString *urlStr = @"http://d.hiphotos.baidu.com/image/pic/item/37d3d539b6003af3290eaf5d362ac65c1038b652.jpg";
    NSURL *url = [NSURL URLWithString:urlStr];

    // 2.根据地址下载图片的二进制数据(这句代码最耗时)
    NSLog(@"---begin");
    NSData *data = [NSData dataWithContentsOfURL:url];
    NSLog(@"---end");

    // 3.设置图片
    UIImage *image = [UIImage imageWithData:data];

    // 4.回到主线程,刷新UI界面(为了线程安全)
    [self performSelectorOnMainThread:@selector(downloadFinished:) withObject:image waitUntilDone:NO];
//    [self performSelector:@selector(downloadFinished:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];
//    [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];

    NSLog(@"-----done----");
}

- (void)downloadFinished:(UIImage *)image
{
    self.imageView.image = image;

    NSLog(@"downloadFinished---%@", [NSThread currentThread]);
}