线程间通信
线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信
线程间通信的体现
1个线程传递数据给另1个线程
在1个线程中执行完特定任务后,转到另1个线程继续执行任务
线程间通信常用方法
- (void)performSelectorOnMainThread:(SEL)aSelectorwithObject:(id)argwaitUntilDone:(BOOL)wait;
- (void)performSelector:(SEL)aSelectoronThread:(NSThread*)thrwithObject:(id)argwaitUntilDone:(BOOL)wait;
线程间通信示例
利用performSelectorInBackground异步加载网络图片
图片加载完成后,利用performSelectorOnMainThread更新 UI
定义 UI 属性
@interface ViewController()
@property(nonatomic,strong)UIScrollView*scrollview;
@property(nonatomic,weak)UIImageView*imageView;
@end
实现loadView方法
- (void)loadView {
_scrollview = [[UIScrollViewalloc] init];
self.view= _scrollview;
self.view.backgroundColor= [UIColorgreenColor];
UIImageView*iv = [[UIImageViewalloc] init];
[self.viewaddSubview:iv];
_imageView = iv;
}
加载视图层次结构, 用纯代码开发应用程序时使用功能和Storyboard&XIB是等价的, 如果重写了loadView,Storyboard & XIB都无效
在 viewDidLoad 方法中调用downloadImage方法
视图加载完成后执行, 可以做一些数据初始化的工作,例如加载数据
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 1. 建立 URL
NSString*urlString =@"http://z.k1982.com/show_img/201303/2013033003475532.jpg";
NSURL*url = [NSURL URLWithString:urlString];
[self downloadImage:url];
}
- (void)downloadImage:(NSURL*)url {
}
实现downloadImage:异步下载图像
- (void)downloadImage:(NSURL*)url {
// 2. 根据 URL 从网络服务器获取图像文件的二进制数据
NSData*data = [NSData dataWithContentsOfURL:url];
// 3. 将二进制数据转换成图像
UIImage*image = [UIImage imageWithData:data];
// 4. 设置图像视图[self setImage:image];
NSLog(@"OK %@", [NSThread currentThread]);
}
新建setImage:方法,在主线程更新 UI
- (void)setImage:(UIImage*)image {
NSLog(@"%s %@", __FUNCTION__, [NSThread currentThread]);
self.imageView.image= image;
[self.imageViewsizeToFit];
self.scrollview.contentSize= image.size;
}
如果要访问网络数据,需要在Info.Plist中增加App Transport Security Settings
线程间通讯
在后台执行下载方法
[self performSelectorInBackground:@selector(downloadImage:) withObject:url];
在主线程更新 UI
[self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];