`

iPhone开发多线程开发之NSThread——异步下载图片 .

    博客分类:
  • ios
阅读更多
实现的功能:1)演示多线程NSThread开发;2)子线程中执行下载图片工作,图片下载完成前显示等待框;

关键词:多线程 NSThread 等待框


运行效果图:
[img]

[/img]
[img]

[/img]







1、新建视图控制器ViewController(不带xib),作为根视图控制器,通过ViewController的-(void)loadView方法构建UI,ViewController.h如下:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<NSURLConnectionDelegate>

@property(strong,nonatomic)UIImageView *imageView;
@property(strong,nonatomic)NSMutableData *buffer;
@property Boolean done;
@end



ViewController.m如下:

#import "ViewController.h"
@implementation ViewController
@synthesize imageView;
@synthesize buffer;
@synthesize done;

-(void)loadView{
    //初始化视图
    [self initViews];
    
    NSString *url = @"http://avatar.csdn.net/4/D/5/1_m_changgong.jpg";
    //在子线程执行图片下载操作
    [NSThread detachNewThreadSelector:@selector(downloadAppImage:) toTarget:self withObject:url];
}

//初始化视图组件
-(void)initViews{
    CGRect frame = [UIScreen mainScreen].applicationFrame;
    imageView = [[UIImageView alloc]initWithFrame:frame];
    self.view = imageView;
    [self.view setBackgroundColor:[UIColor whiteColor]];
}

//下载图片
-(void)downloadAppImage:(NSString *) url{
    //展示等待框
    [self showWaiting];
    
    done = NO;
    //初始化缓冲区
    buffer = [NSMutableData data];
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
    //设置请求及连接
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
    NSURLConnection *connnection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
    if(connnection!=nil){
        while(!done){
             //NSLog(@"doing..");
            [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
        }
    }
    //生成UIImage实例
    UIImage *img = [UIImage imageWithData:buffer];
    //通知主线程
    [self performSelectorOnMainThread:@selector(showImage:) withObject:img waitUntilDone:NO]; 
    
    request = nil;
    connnection = nil;
}

//填充图片
-(void)showImage:(UIImage *)img{  
    [self.imageView setImage:img];
    
    //关闭等待框
    [self hiddenWaiting];
}

-(void)httpConnectEnd{
    NSLog(@"httpConnectEnd");
}

-(void)httpConnectEndWithError{
    [self hiddenWaiting];
    
    NSLog(@"httpConnectEndWithError");
}

//展示等待框
-(void)showWaiting{
    int width = 32;
    int height = 32;
    CGRect frame = CGRectMake(0, -20, 320, 480);
    int x = frame.size.width;
    int y = frame.size.height;
    NSLog(@"x=%d,y=%d",x,y);
    
    frame = CGRectMake((x-width)/2, (y-height)/2, width, height);
    UIActivityIndicatorView *progressInd = [[UIActivityIndicatorView alloc]initWithFrame:frame];
    [progressInd startAnimating];
    progressInd.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
    
    frame = CGRectMake((x-70)/2, (y-height)/2+height, 80, 20);
    UILabel *waitinglabel = [[UILabel alloc]initWithFrame:frame];
    waitinglabel.text = @"正在下载应用程序图片...";
    waitinglabel.textColor = [UIColor redColor];
    waitinglabel.font = [UIFont systemFontOfSize:15];
    waitinglabel.backgroundColor = [UIColor clearColor];
    
    frame = CGRectMake(0, -20, 320, 480);
    UIView *waitingView = [[UIView alloc]initWithFrame:frame];
    waitingView.backgroundColor = [UIColor blackColor];
    waitingView.alpha = 0.7;
    
    [waitingView addSubview:progressInd];
    [waitingView addSubview:waitinglabel];
    
    [waitingView setTag:110];//设置tag
    [self.view addSubview:waitingView];
}

//隐藏等待框
-(void)hiddenWaiting{
    //根据tag找到waitingView
    [[self.view viewWithTag:110]removeFromSuperview];
}


- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

#pragma mark NSURLConnection Delegate methods
//不执行缓存
-(NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse{
    return nil;
}

//连接发生错误
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    [self performSelectorOnMainThread:@selector(httpConnectEndWithError) withObject:self waitUntilDone:NO];
    [buffer setLength:0];
}

//接收数据
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    [buffer appendData:data];
}

//下载完毕
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    //NSLog(@"connectionDidFinishLoading");
    [self performSelectorOnMainThread:@selector(httpConnectEnd) withObject:nil waitUntilDone:NO]; 
    //self.done = YES;
}

@end
  • 大小: 71.1 KB
  • 大小: 166.7 KB
分享到:
评论

相关推荐

    iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD

    在iOS开发中,有多种实现多线程的方式,包括`NSThread`、`NSOperation`以及`GCD`(Grand Central Dispatch)。 1. **NSThread** - **应用场景**:适用于需要将Objective-C中的某个方法放到独立线程中运行的情况。 ...

    利用NSThread实现异步更新UI和下载图片

    今天写这个demo就是为了理解多线程的概念并记录下一些NSThread的基本操作。总共开启了3个子线程,其中两个线程陷入死循环模拟耗时操作,并由bool变量run控制同步更新UI操作。另外一个线程则实现了从网上下载图片并将...

    iphone开发多线程

    本文将深入探讨“iPhone开发多线程”这一主题,基于提供的描述和标签,我们将关注iOS平台上的多线程概念、实现方式以及一个名为“ThreadSyncSample”的示例项目。 首先,我们需要理解什么是多线程。在单线程环境中...

    iPhone开发之多线程入门示例程序

    在“iPhone开发之多线程入门示例程序”中,我们主要会接触到苹果的Foundation框架中的多线程解决方案,包括NSThread、NSOperation和GCD(Grand Central Dispatch)。 首先,NSThread是Objective-C中的一个类,它...

    多线程.rar

    总结:在iPhone开发中,熟练掌握多线程技术,合理运用Object-C提供的NSOperationQueue、GCD以及NSThread,是构建高性能、响应迅速的应用的关键。理解线程安全和线程间通信,以及如何进行性能优化,对于提升应用质量...

    Iphone下多线程的开发

    ### IPhone下多线程的开发 随着移动设备性能的不断提升以及用户对应用程序功能和响应速度的要求越来越高,多线程编程已经成为iOS应用开发中的一个重要组成部分。本文将从以下几个方面详细介绍在iPhone下进行多线程...

    iOS 开发 之 多线程总结

    iOS开发中的多线程技术是提升应用性能和用户体验的关键,特别是在处理耗时操作时,如网络请求、数据计算或大文件上传。本文将对多线程进行深入总结,主要涵盖线程的基本概念、使用多线程的原因以及在iPhone平台上...

    iphone多线程编程

    "iPhone多线程编程"这个主题涵盖了许多关键概念和实践技巧,对于任何想要深入学习iOS开发的初学者来说,都是一块不可或缺的基石。 多线程的基本概念: 1. 主线程:应用程序的主要执行流程,负责UI更新和用户交互。...

    iOS iPhone多线程编程指南(中英文版本的两个pdf文件

    这份"iOS iPhone多线程编程指南"详细讲解了如何在iPhone平台上有效地进行多线程操作,对于iOS开发者来说是一份宝贵的资源。以下是该指南可能涵盖的关键知识点: 1. **基础概念**:首先,指南会介绍多线程的基本概念...

    iphone多线程编程指南

    ### iPhone多线程编程指南知识点解析 #### 一、多线程编程概述 **1.1 什么是多线程** 多线程是指在一个程序中同时运行多个代码路径的能力。这使得程序可以在执行某些任务的同时处理其他任务,从而提高程序的整体...

    Objective-C高级编程 iOS与OS X多线程和内存管理

    本书重点聚焦于多线程和内存管理两个关键领域,对于iOS和macOS应用开发人员来说,这是理解和优化应用程序性能不可或缺的知识。 在Objective-C中,内存管理是通过引用计数(Reference Counting)和自动引用计数...

    iphone中线程的使用

    综上所述,iPhone中线程的使用涉及到多线程技术的选择、线程安全的保障以及合理利用GCD进行任务调度。熟练掌握这些知识点,对于编写高效、稳定的iOS应用至关重要。通过实际操作和实践,你可以更好地理解和运用这些...

    iOS开发文档(中文)-2

    本资料包主要涵盖了四个关键主题:iPhone开发进阶、iPhone入门开发经验之谈、多线程编程指南以及iPhone用户界面设计精粹。下面将对这些主题进行详细阐述。 首先,"iPhone开发进阶"这部分内容可能涉及到高级的iOS...

    iphone开发比较实用,object-c注意事项,能提高不少

    9. **Foundation框架**:这是iOS开发的基础,包含了诸如NSArray、NSDictionary、NSString等常用数据结构,以及NSThread、NSOperationQueue等多线程支持。 10. **Delegation**:委托设计模式是Objective-C中的重要...

    show-view.zip_DEMO_iphone xml

    在iOS开发中,XML解析和多线程是两个重要的技术领域。XML(eXtensible Markup Language)是一种标记语言,广泛用于数据交换和结构化数据存储。本DEMO实例主要展示了如何在iPhone应用中处理XML数据,并且结合了多线程...

    利用iphone的多线程实现“售票系统”

    在iOS开发中,Objective-C和Swift语言都有各自的多线程编程模型,其中Objective-C通常使用 `NSThread` 和 `GCD` 来进行多线程编程,而Swift则使用 `DispatchQueue`、`Operation` 和 `OperationQueue`。苹果在WWDC ...

    Cocoa and Objective-C cookbook

    为了提高应用程序的响应速度和执行效率,合理地使用多线程和异步编程技术是非常重要的。本书将详细介绍如何使用NSThread、NSOperationQueue以及Block等技术来实现并发编程。同时,还将涉及GCD(Grand Central ...

    深入浅出Cocoa教程

    - [深入浅出Cocoa]之多线程NSThread - [深入浅出Cocoa]多线程编程之block与dispatchqueue - [深入浅出Cocoa]之Bonjour网络编程 - [深入浅出Cocoa]之Framework - [深入浅出Cocoa]之Plugin - [深入浅出Cocoa]之...

    CocoaFundamentals.pdf

    - **线程管理:**利用NSThread和NSOperationQueue来管理多线程任务。 - **异步编程:**通过NSBlock等技术实现非阻塞式的数据处理。 #### Chapter 4: Cocoa Design Patterns **知识点概述:** 本章介绍了Cocoa...

Global site tag (gtag.js) - Google Analytics