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 UIButton *button;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

}

// 加载网络图片的方法
- (UIImage *)loadImageWithUrl:(NSString *)urlStr {

//  URL: 同一资源定位符.定位唯一资源

    NSURL *url = [NSURL URLWithString:urlStr];

    NSData *data = [NSData dataWithContentsOfURL:url];

    UIImage *img = [UIImage imageWithData:data];

    return img;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

//  1.在子线程下载图片

//  首先, 需要开启新的线程, 需要使用异步函数

//  然后, 并发任务都可以放在全局并发队列, 而UI操作放在主队列

//  因此可以使用(异步函数 + 全局并发队列) 内部嵌套 一个(异步函数 + 主队列)的形式-----常用

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSString *urlStr = @"http://img1a.xgo-img.com.cn/pics/1538/a1537491.jpg";
        UIImage *img = [self loadImageWithUrl:urlStr];

//  2.在主线程更新UI
//      此时回到主线程,更新UI(给button设置背景图)
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.button setBackgroundImage:img forState:UIControlStateNormal];
        });
    });

}

@end
时间: 2024-10-11 16:20:07

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

Android在线程中发送GET和POST请求 在主线程更新UI

public class GetPostUtil { /** * 向指定URL发送GET方法的请求 * * @param url * 发送请求的URL * @param params * 请求参数,请求参数应该是name1=value1&name2=value2的形式. * @return URL所代表远程资源的响应 */ public static String sendGet(String url, String params) { String result = "";

Java笔记七.线程间通信与线程生命的控制

线程间通信与线程生命的控制 一.线程通信方法 Java是通过Object类的wait.notify.notifyAll这几个方法来实现进程键的通信.由于所有的类都是从Object继承的,因此在任何类中都可以直接使用这些方法. wait:告诉当前线程放弃监视器并进入睡眠状态,知道其他线程进入同一监视器并调用notify为止; notify:唤醒同一对象监视器中调用wait的第一个线程.用于类似饭馆有一个空位后通知所有等候就餐的顾客中的第一位可以入座的情况: notifyAll:唤醒同一对象监视器中

线程间通信和线程互斥

线程间通信 1> 线程间通信分为两种 主线程进入子线程(前面的方法都可以) 子线程回到主线程 2> 返回主线程 3> 代码 这个案例的思路是:当我触摸屏幕时,会在子线程加载图片,然后在主线程刷新UI界面 视图布局我就不写了,大家自己来吧,线程间通信代码如下: #pragma mark - 添加响应方法触发创建子线程并加载数据 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

黑马程序员——JAVA基础之Day24 多线程 ,死锁,线程间通信 ,线程组,线程池,定时器。

------- android培训.java培训.期待与您交流! ---------- Lock()实现提供了比使用synchronized方法和语句可获得更广泛的锁定操作. private Lock lock =new ReentrantLock(); 被锁的代码要用   lock.lock()                lock.unlock()    包括.其中用try   ...finally包围 同步:效率低,如果出现同步嵌套,会出现死锁.  但是安全. 死锁问题:两个或者两个以上

线程的几个主要概念----线程间通信;线程死锁;线程控制:挂起、停止和恢复(线程同步的5种方式)

(一)线程同步(5种同步方式) 1.同步方法--->有synchronized关键字修饰的方法.(Java的每个内置对象都有一个内置锁,当用synchronized修饰方法--->内置锁保护整个方法) 在调用该方法前,需要获得内置锁,否则就处于阻塞状态. eg: public  synchronized  void  save(){     } [注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类.] 2.同步代码块:--->有synchron

java多线程——线程间通信之线程等待唤醒机制

三个方法 wait() notify() notifyAll() 三个方法都使用在同步中,因为要对持有锁(又叫监控)的线程操作. 所以要使用在同步中,因为只有同步才具有锁. 为什么这些操作线程的方法均出现在Object类中? 因为这些方法在操作同步中的线程时候,都必须要标识所操作线程识有锁.只有同一个锁上的被等待的线程,可以被同一个锁上的notify唤醒,不可以对不同锁中的线程进行唤醒. 也就是说,等待和唤醒必须是同一个锁. public class Demo1 { public static

线程间通信的三种方式(NSThread,GCD,NSOperation)

一.NSThread线程间通信 #import "ViewController.h" @interface ViewController ()<UIScrollViewDelegate> @property (strong, nonatomic) IBOutlet UIScrollView *scrollView; @property (weak, nonatomic)  UIImageView *imageView; @end @implementation ViewCo

iOS中多线程_05_线程间通信NSThread/GCD

1.什么叫做线程间通信 在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 2.线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后,转到另1个线程继续执行任务 3.线程间通信示例 UIImageView下载图片这个例子, 主线程中开启一个子线程去下载图片, 当图片下载完成之后再回到主线程中更新显示图片, 这样的一个过程就是线程间通信的一个过程. 4.NSThread线程间通信常用方法 // 第一种- (void)performSelectorOnMain

Java 里如何实现线程间通信

正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了.本文涉及到的知识点:thread.join(), object.wait(), object.notify(), CountdownLatch, CyclicBarrier, FutureTask, Callable 等. 下面我从几个例子作为切入点来讲解下 Java 里有哪些方法来实现线程间通信. 如何让两个线程依次执行? 那如何让 两个线程按照指定方式有序交叉运