NSThread 有两种直接创建方式:
- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument
+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
第一个是实例方法,第二个是类方法,使用方法如下:
[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];
NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];
[myThread start];
其中类方法是自启动的(直接创建并运行),实例方法是先创建线程,再进行线程操作。
各参数的含义:
selector :线程执行的方法,这个selector只能有一个参数,而且不能有返回值。
target :selector消息发送的对象
argument:传输给target的唯一参数,也可以是nil
新建singeView app
IBOutlet UIImageView *iv; - (IBAction)showImage:(id)sender;属性和方法;
ViewController.m中实现:
#import "ViewController.h"
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (IBAction)showImage:(id)sender
{
NSString* url = @
@"https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png";
// 创建新线程对象
NSThread *thread = [[NSThread alloc]initWithTarget:self
selector:@selector(downloadImageFromURL:) object:url];
// 启动线程
[thread start];
}
// 定义一个方法作为线程执行体。
-(void)downloadImageFromURL:(NSString *) url
{
// 从网络获取数据
NSData *data = [[NSData alloc]
initWithContentsOfURL:[NSURL URLWithString:url]];
// 将网络数据初始化为UIImage对象
UIImage *image = [[UIImage alloc]initWithData:data];
if(image != nil)
{
// 在主线程中执行updateUI:方法
[self performSelectorOnMainThread:@selector(updateUI:)
withObject:image waitUntilDone:YES];
}
else
{
NSLog(@"---下载图片出现错误---");
}
}
-(void)updateUI:(UIImage*) image
{
self.iv.image = image;
}
@end
效果如下:
当加载地址是使用http通信时,会产生如下错误:
本文详细介绍了如何在iOS应用中利用NSThread创建新线程,通过发送消息执行特定任务来实现从网络下载图片,并在主线程中更新UI。同时解决了Xcode7中使用http通信时出现的安全警告。
633

被折叠的 条评论
为什么被折叠?



