• iOS: 学习笔记, 使用performSelectorOnMainThread及时刷新UIImageView


    在iOS中, 界面刷新在主线程中进行, 这导致NSURLSession远程下载图片使用UIImageView直接设置Image并不能及时刷新界面.

    下面的代码演示了如何使用 performSelectorOnMainThread: withObject:  waitUntilDone: 方法来及时刷新图片

    1. 创建iOS空应用程序(Empty Application).

    2. 加入一个控制器类. 在YYAppDelegate.m中修改

    #import "MainViewController.h"
    
    @implementation YYAppDelegate
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        // Override point for customization after application launch.
        self.window.backgroundColor = [UIColor whiteColor];
        
        self.window.rootViewController = [[MainViewController alloc] initWithNibName:nil bundle:nil];
        
        [self.window makeKeyAndVisible];
        return YES;
    }

    3. 修改MainViewController.m文件

      1 //
      2 //  MainViewController.m
      3 //  UIByCodeDemo0602_ImageView
      4 //
      5 //  Created by yao_yu on 14-6-3.
      6 //  Copyright (c) 2014年 yao_yu. All rights reserved.
      7 //
      8 
      9 #import "MainViewController.h"
     10 
     11 @interface MainViewController ()
     12 
     13 @property(nonatomic, strong)UILabel *header;
     14 @property(nonatomic, strong)UIImageView *imageView;
     15 @property(nonatomic, strong)UIImage *imagedata;
     16 
     17 @end
     18 
     19 @implementation MainViewController
     20 
     21 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
     22 {
     23     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
     24     if (self) {
     25         // Custom initialization
     26     }
     27     return self;
     28 }
     29 
     30 - (void)viewDidLoad
     31 {
     32     [super viewDidLoad];
     33     self.imagedata = nil;
     34     
     35     //创建标题标签
     36     self.header = [[UILabel alloc] init];
     37     self.header.text = @"示意图";
     38     self.header.textAlignment = NSTextAlignmentCenter;
     39     [self.view addSubview: self.header];
     40     [self.header setTranslatesAutoresizingMaskIntoConstraints: NO];
     41     
     42     //创建图片视图
     43     self.imageView = [[UIImageView alloc] init];
     44     [self.imageView setBackgroundColor: [UIColor blueColor]];
     45     [self.imageView setImage: [UIImage imageWithContentsOfFile:@"/Users/yao_yu/Documents/aaa/3002302_.png"]];
     46     self.imageView.layer.cornerRadius = 10;
     47     [self.view addSubview:self.imageView];
     48     [self.imageView setTranslatesAutoresizingMaskIntoConstraints: NO];
     49     
     50     //创建前一张按钮
     51     UIButton *prevButton = [[UIButton alloc] init];
     52     prevButton.frame = CGRectMake(0, 20, 300, 20);
     53     [prevButton setBackgroundColor:[UIColor redColor]];
     54     [prevButton setTitle:@"前一张" forState:UIControlStateNormal];
     55     [prevButton addTarget:self action:@selector(onShowPrevImage:) forControlEvents:UIControlEventTouchUpInside];
     56     [self.view addSubview: prevButton];
     57     [prevButton setTranslatesAutoresizingMaskIntoConstraints: NO];
     58     
     59     //创建后一张按钮
     60     UIButton *nextButton = [[UIButton alloc] init];
     61     nextButton.frame = CGRectMake(0, 20, 300, 20);
     62     [nextButton setBackgroundColor:[UIColor redColor]];
     63     [nextButton setTitle:@"后一张" forState:UIControlStateNormal];
     64     [nextButton addTarget:self action:@selector(onShowNextImage:) forControlEvents:UIControlEventTouchUpInside];
     65     [self.view addSubview: nextButton];
     66     [nextButton setTranslatesAutoresizingMaskIntoConstraints: NO];
     67     
     68     //约束
     69     NSMutableArray *contraits = [NSMutableArray array];
     70     NSDictionary *metrics = [NSDictionary dictionaryWithObjectsAndKeys:@20, @"VDist", @5, @"Padding", nil];
     71     UILabel *header = self.header;
     72     UIImageView *imageView = self.imageView;
     73     NSDictionary *views = NSDictionaryOfVariableBindings(header, imageView, prevButton, nextButton);
     74     
     75     [contraits addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-Padding-[header]-Padding-|" options:0 metrics:metrics views:views]];
     76     [contraits addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-Padding-[prevButton]-(>=0)-[nextButton(==prevButton)]-Padding-|" options:0 metrics:metrics views:views]];
     77     
     78     [contraits addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-Padding-[imageView]-Padding-|" options:0 metrics:metrics views:views]];
     79     [contraits addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-VDist-[header]-Padding-[imageView]-(>=VDist)-|" options:0 metrics:metrics views:views]];
     80     //垂直居中
     81     [self.view addConstraint:[NSLayoutConstraint constraintWithItem:prevButton attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]];
     82     [self.view addConstraint:[NSLayoutConstraint constraintWithItem:nextButton attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]];
     83     
     84     [self.view addConstraints:contraits];
     85     
     86 }
     87 
     88 - (void)didReceiveMemoryWarning
     89 {
     90     [super didReceiveMemoryWarning];
     91 }
     92 
     93 -(void)onShowPrevImage:(id)sender
     94 {
     95     NSURL *URL = [NSURL URLWithString:@"http://img.gtimg.cn/images/hq_parts/hushen/stocks/300230.png"];
     96     NSURLRequest *request = [NSURLRequest requestWithURL:URL];
     97     NSURLSession *session = [NSURLSession sharedSession];
     98     NSURLSessionDataTask *task = [session dataTaskWithRequest:request
     99                                             completionHandler:
    100                                   ^(NSData *data, NSURLResponse *response, NSError *error) {
    101                                       self.imageView.image = nil;
    102                                       self.imagedata = [UIImage imageWithData:data];
    103                                       [self performSelectorOnMainThread:@selector(updateMyImage) withObject:nil  waitUntilDone:NO];
    104                                   }];
    105     
    106     [task resume];
    107     
    108 }
    109 
    110 -(void)onShowNextImage:(id)sender
    111 {
    112     NSURL *URL = [NSURL URLWithString:@"http://img.gtimg.cn/images/hq_parts/hushen/stocks/300023.png"];
    113     NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    114     NSURLSession *session = [NSURLSession sharedSession];
    115     NSURLSessionDataTask *task = [session dataTaskWithRequest:request
    116                                             completionHandler:
    117                                   ^(NSData *data, NSURLResponse *response, NSError *error) {
    118                                       self.imageView.image = nil;
    119                                       self.imagedata = [UIImage imageWithData:data];
    120                                       [self performSelectorOnMainThread:@selector(updateMyImage) withObject:nil  waitUntilDone:NO];
    121                                   }];
    122     
    123     [task resume];
    124 }
    125 
    126 - (void)updateMyImage
    127 {
    128     if (!self.imageView.image)
    129         self.imageView.image = self.imagedata;
    130     return;
    131 }
    132 
    133 @end

    4. 运行

  • 相关阅读:
    聊天界面的实现
    继续,迫不及待想学数据库
    今天休息,我来研究上次的代码了
    项目导入
    命令行常用的一下命令
    svn的安装和基本操作,及常见问题
    maven项目里写测试
    Eclipse里新建maven项目
    maven简介
    重装win7,没有管理员权限,没有以管理员身份运行
  • 原文地址:https://www.cnblogs.com/yaoyu126/p/3772405.html
Copyright © 2020-2023  润新知