ios 多线程的故事4

线程间通信

线程间通信:在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

ios 多线程的故事4_第1张图片

定义 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];

你可能感兴趣的:(ios 多线程的故事4)