开子线程下载图片,回到主线程刷新UI步骤

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [NSThread detachNewThreadSelector:@selector(download) toTarget:self withObject:nil];
}

#pragma mark ----------------------
#pragma Methods

//开子线程下载图片,回到主线程刷新UI
-(void)download
{
    //1.确定URL
    NSURL *url = [NSURL URLWithString:@"http://img4.duitang.com/uploads/blog/201310/18/20131018213446_smUw4.thumb.700_0.jpeg"];

    //2.根据url下载图片二进制数据到本地
    NSData *imageData = [NSData dataWithContentsOfURL:url];

    //3.转换图片格式
    UIImage *image = [UIImage imageWithData:imageData];

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

    //4.回到主线程显示UI
    /*
     第一个参数:回到主线程要调用哪个方法
     第二个参数:前面方法需要传递的参数 此处就是image
     第三个参数:是否等待
     */
    //[self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:NO];

 [self performSelector:@selector(showImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];

//    self.imageView.image = image;
    NSLog(@"---end---");
}

//更新UI操作
-(void)showImage:(UIImage *)image
{
    self.imageView.image = image;
    NSLog(@"UI----%@",[NSThread currentThread]);
}
performSelectorOnMainThread:和performSelector:方法都可以也可以直接用对象self.imageView调用performSelectorOnMainThread:方法,使用对象self.imageView的image属性的setImage:方法来实现(这样可以省略创建showImage方法)。

[self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];

时间: 2024-10-10 15:38:19

开子线程下载图片,回到主线程刷新UI步骤的相关文章

2. GCD的使用(线程间通信---子线程执行耗时操作/主线程更新UI)

// // ViewController.m // 07-线程间通信(加载图片,在主线程中更新UI) // // Created by Jasperay on 15/9/3. // Copyright (c) 2015年 @aLonelyRoot3. All rights reserved. // #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UI

GCD开启子线程下载图片

//开启子线程下载图片 //1.获取一个全局串行队列    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    __weak typeof(self) weakSelf = self; //2.把任务添加到队列中执行    dispatch_async(queue, ^{        NSURL *url = [NSURL URLWithString:_imgStr

线程:子线程先循环十次,主线程在循环20次,再子线程循环十次,主线程循环20次,如此循环50次

子线程先循环十次,主线程在循环20次,再子线程循环十次,主线程循环20次,如此循环50次 1 /** 2 * 子线程先循环十次,主线程在循环20次,再子线程循环十次,主线程循环20次,如此循环50次 3 * @author llj 4 * 5 */ 6 public class ThreadTest { 7 8 public static void main(String[] args) { 9 Syn syn = new Syn(); 10 new Thread(new Runnable()

后台打印:This application is modifying the autolayout engin from a background thread,which can lead to engine corruption and weird crashes可能是因为没有在主线程刷新UI

后台打印:This application is modifying the autolayout engin from a background thread,which can lead to engine corruption and weird crashes可能是因为没有在主线程刷新UI

ios 中请求主线程刷新UI

1 if ([NSThread isMainThread]) 2 { 3 [self.downloadMapBtn setImage:[UIImage imageNamed:@"download_map.png"] forState:UIControlStateNormal]; 4 [self.downloadMapBtn setNeedsDisplay]; 5 } 6 else 7 { 8 dispatch_sync(dispatch_get_main_queue(), ^{ 9 /

主线程中一定不能放耗时操作,必须要开子线程,比如下载文件,不然会不让你拿到输入流--报错显示android.os.NetworkOnMainThreadException

1.必须要开子线程来操作耗时操作,android.os.NetworkOnMainThreadException new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { updateFile = Environment.getExternalStorageDirectory() + "/3530.jpg"; //downloadUpdateFil

android 子线程使用handle修改主线线程内容

1.子线程使用handle修改主线线程内容简单案例 1).activity_handle.xml <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="ht

蓝牙连接后,启动子线程接收数据,主线程卡住了

============问题描述============ 我看了下google的bluetoothchat的demo,它那里把蓝牙建立客户端连接的部分也放在子线程里执行的. 我目前的程序,蓝牙建立连接的步骤是在UI线程里,但是bluetoothSocket接收数据的部分是在子线程中的,但是现在碰到一个问题,开启子线程后,主线程不接着往下执行了. 根据我的日志记录,connectedThread.run();之后的日志方法LogHelper.Write("已经运行过子线程");就一直卡着

Android AsyncTask使用心得及错误处理-只能在主线程改变UI组件

大家肯定都会经常使用AsyncTask这个类,特别是在网络处理中,先看改正后的代码:这是正常的代码: class sendKeyTask extends AsyncTask<String, Void, Integer> { @Override protected void onPostExecute(Integer resultCode) { // TODO Auto-generated method stub super.onPostExecute(resultCode); switch (