- 浏览: 534968 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
tangyunliang:
大哥你太历害了谢谢
Android基于XMPP Smack Openfire开发IM【四】初步实现两个客户端通信 -
u013015029:
LZ,请问下,在// 添加消息到聊天窗口 , 这里获取Ed ...
Android基于XMPP Smack Openfire开发IM【四】初步实现两个客户端通信 -
endual:
怎么保持会话,我搞不懂啊
Android基于XMPP Smack Openfire开发IM【一】登录openfire服务器 -
donala_zq:
显示:[2013-11-30 11:50:36 - Andro ...
android-----------新浪微博 -
donala_zq:
哥,运行不了啊
android-----------新浪微博
实现的功能:1)演示多线程NSOperation&NSOperationQueue开发;2)子线程中执行下载图片工作,图片下载完成前显示等待框和下载进度条;
关键词:多线程 NSOperation NSOperationQueue 等待框
效果图如下:
[img]
[/img]
[img]
[/img]
1、新建视图控制器ViewController(不带xib),作为根视图控制器,通过ViewController的-(void)loadView方法构建UI。
2、新建继承自NSOperation且实现协议NSURLConnectionDelegate的类DownLoadImageTask,DownLoadImageTask.h如下:
DownLoadImageTask.m如下:
DownLoadImageTask中定义了协议DownLoadImageDelegate,ViewController需要实现协议DownLoadImageDelegate;DownLoadImageTask下载工作完成后,会回调ViewController实现的DownLoadImageDelegate协议中的方法。
2、ViewController.h如下:
ViewController.m如下:
关键词:多线程 NSOperation NSOperationQueue 等待框
效果图如下:
[img]
[/img]
[img]
[/img]
1、新建视图控制器ViewController(不带xib),作为根视图控制器,通过ViewController的-(void)loadView方法构建UI。
2、新建继承自NSOperation且实现协议NSURLConnectionDelegate的类DownLoadImageTask,DownLoadImageTask.h如下:
#import <Foundation/Foundation.h> @protocol DownLoadImageDelegate; @interface DownLoadImageTask : NSOperation<NSURLConnectionDelegate>{ int operationId; long long totalLength; BOOL done; } @property int operationId; @property(nonatomic,assign) id<DownLoadImageDelegate>downloadImageDelegate; @property(nonatomic,retain) NSMutableData *buffer; @property(nonatomic,retain) NSURLRequest *request; @property(nonatomic,retain) NSURLConnection *connection; - (id)initWithURLString:(NSString *)url; @end @protocol DownLoadImageDelegate //图片下载完成的委托 -(void)imageDownLoadFinished:(UIImage *)img; //更新图片下载进度条的值 -(void)updateDownProgress:(double) value; @end
DownLoadImageTask.m如下:
@implementation DownLoadImageTask @synthesize operationId; @synthesize downloadImageDelegate; @synthesize buffer; @synthesize request; @synthesize connection; - (id)initWithURLString:(NSString *)url{ NSLog(@"url=%@",url); self = [super init]; if(self){ request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; buffer = [NSMutableData data]; } return self; } //主要处理方法 -(void)start{ //或者main NSLog(@"DownLoadImageTask-start"); if(![self isCancelled]){ //暂停一下 [NSThread sleepForTimeInterval:1]; //设置connection及其代理 connection = [[NSURLConnection alloc]initWithRequest:request delegate:self]; if(connection!=nil){ while(!done){ [[NSRunLoop currentRunLoop]runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; } } } } -(void)httpConnectEndWithError{ //[self hiddenWaiting]; NSLog(@"httpConnectEndWithError"); } -(void)dealloc{ buffer = nil; connection = nil; request = nil; downloadImageDelegate = nil; } #pragma 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 didReceiveResponse:(NSURLResponse *)response{ NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; if(httpResponse && [httpResponse respondsToSelector:@selector(allHeaderFields)]){ NSDictionary *httpResponseHeaderFields = [httpResponse allHeaderFields]; totalLength = [[httpResponseHeaderFields objectForKey:@"Content-Length"] longLongValue]; NSLog(@"totalLength is %lld",totalLength); } } //接收数据 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ //NSLog(@"didReceiveData..."); [buffer appendData:data]; double progressValue = totalLength==0?0:((double)([buffer length])/(double)totalLength); //更新进度条值 [downloadImageDelegate updateDownProgress:progressValue]; } //下载完毕 -(void)connectionDidFinishLoading:(NSURLConnection *)connection{ done = YES; UIImage *img = [[UIImage alloc] initWithData:buffer]; [downloadImageDelegate imageDownLoadFinished:img]; } -(BOOL)isConcurrent { //返回yes表示支持异步调用,否则为支持同步调用 return YES; } - (BOOL)isExecuting{ return connection == nil; } - (BOOL)isFinished{ return connection == nil; } @end
DownLoadImageTask中定义了协议DownLoadImageDelegate,ViewController需要实现协议DownLoadImageDelegate;DownLoadImageTask下载工作完成后,会回调ViewController实现的DownLoadImageDelegate协议中的方法。
2、ViewController.h如下:
#import "DownLoadImageTask.h" @interface ViewController:UIViewController<DownLoadImageDelegate>{ } @property(strong,nonatomic)NSOperationQueue *queue; @property(strong,nonatomic)UIImageView *appImgView; @end
ViewController.m如下:
#import "ViewController.h" #import "DownLoadImageTask.h" @implementation ViewController @synthesize queue; @synthesize appImgView; -(void)loadView{ //初始化视图 [self initViews]; //显示等待框 [self showWaiting]; NSString *url = @"http://hiphotos.baidu.com/newwen666666/pic/item/01ec7750863e49600cf3e3cc.jpg"; int index = 1; DownLoadImageTask *task = [[DownLoadImageTask alloc]initWithURLString:url]; task.downloadImageDelegate = self; task.operationId = index++; queue = [[NSOperationQueue alloc]init]; [queue addOperation:task]; } //初始化视图组件 -(void)initViews{ CGRect frame = [UIScreen mainScreen].applicationFrame; UIView *appView = [[UIView alloc]initWithFrame:frame]; self.view = appView; [self.view setBackgroundColor:[UIColor colorWithWhite:1.0 alpha:1.0]]; frame = CGRectMake(0, 0, frame.size.width, frame.size.height); appImgView = [[UIImageView alloc]initWithFrame:frame]; [self.view addSubview:appImgView]; } //展示等待框 -(void)showWaiting{ CGRect frame = CGRectMake(0, -20, 320, 480); int x = frame.size.width; int progressWidth = 150; int progressHeight = 32; frame = CGRectMake((x-progressWidth)/2, 100, progressWidth, progressHeight); UIProgressView *progress = [[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleBar]; progress.frame = frame; progress.progress = 0.0; progress.backgroundColor = [UIColor whiteColor]; UILabel *showValue = [[UILabel alloc]init]; frame = showValue.frame; frame.origin.x = CGRectGetMaxX(progress.frame)+10; frame.origin.y = CGRectGetMinY(progress.frame); frame.size.width = 45; frame.size.height = 15; showValue.frame = frame; showValue.backgroundColor = [UIColor redColor]; showValue.text = @"0.0"; int progressIndWidth = 32; int progressIndHeight = 32; frame = CGRectMake((x-progressIndWidth)/2, 100+32, progressIndWidth, progressIndHeight); UIActivityIndicatorView *progressInd = [[UIActivityIndicatorView alloc]initWithFrame:frame]; [progressInd startAnimating]; progressInd.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; frame = CGRectMake((x-70)/2, 100+32+32, 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 *theView = [[UIView alloc]initWithFrame:frame]; theView.backgroundColor = [UIColor blackColor]; theView.alpha = 0.7; [progress setTag:100]; [theView addSubview:progress]; [showValue setTag:101]; [theView addSubview:showValue]; [theView addSubview:progressInd]; [theView addSubview:waitinglabel]; [theView setTag:110]; [self.view addSubview:theView]; } //隐藏等待框 -(void)hiddenWaiting{ [[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 DownLoadImageDelegate methods //展示下载完毕的图片 -(void)imageDownLoadFinished:(UIImage *)img{ //退出等待框 [self hiddenWaiting]; [appImgView setImage:img]; } //更新进度条的值 -(void)updateDownProgress:(double) value{ UIProgressView *progresss = (UIProgressView *)[self.view viewWithTag:100]; UILabel *showValue = (UILabel*)[self.view viewWithTag:101]; progresss.progress = value; showValue.text = [NSString stringWithFormat:@"%.1f%",(double)(value*100)]; } @end
发表评论
-
新风作浪博客学习(十九)在iOS虚拟键盘上添加动态隐藏按钮
2013-06-08 09:19 860为了给用户比较良好的交付,想在键盘上添加一个按钮,实时根据键盘 ... -
新风作浪博客学习(十八)openURL的使用(iOS调用系统电话、浏览器、地图、邮件等) .
2013-06-08 09:19 1004今天遇见一行代码实现打开一个网页,比起印象里的UIWebVie ... -
新风作浪博客学习(十七)UIImageView响应点击事件 .
2013-06-08 09:19 705有时候会遇到点击一张图片,然后让这张图片触发一个事件,或者是跳 ... -
新风作浪博客学习(十六)Navigation + Tab Bar 常用组合框架 .
2013-06-07 08:50 1253看到很多项目中都采用的是Navigation加Tab Bar组 ... -
新风作浪博客学习(十五)google地图定位小Demo .
2013-06-07 08:50 1141[img][/img]今天写的是一个简单功能的google地图 ... -
新风作浪博客学习(十四)怎样向iPhone模拟器中添加图片 .
2013-06-07 08:50 786在我们做项目中可能需要使用图库,模拟器是有图库的,但是如何像其 ... -
新风作浪博客学习(十三)表视图的分组分区和索引分区 .
2013-06-07 08:50 801本次实现的是表视图的分区和索引,代码和前面都差不多,主要还是代 ... -
新风作浪博客学习(十二)代码实现UITableViewCell表视图单元定制 .
2013-06-07 08:49 1001通常情况下我们会希望单元格UITableViewCell显示自 ... -
新风作浪博客学习(十一)UITableViewCell的标记、移动、删除、插入 .
2013-06-06 09:15 1118这篇文章是建立在 代码实现 UITableView与UITa ... -
新风作浪博客学习(十)代码实现 UITableView与UITableViewCell .
2013-06-06 09:14 1155我们常用的表格类视图就是用 UITableView与UITab ... -
新风作浪博客学习(九)两个UIPickerView控件间的数据依赖 .
2013-06-06 09:14 1072本篇实现功能是两个选取器的关联操作,滚动第一个滚轮第二个滚 ... -
新风作浪博客学习(八)代码实现UIPickerView .
2013-06-06 09:14 1284先说一下当个组件选取器,我们创建一个数组NSAray来保存选取 ... -
新风作浪博客学习(七)代码 实现UIDatePicker控件 和 Tab Bar 视图切换 .
2013-06-06 09:15 1108感觉代码写控件都一个理,先在ViewDidLoad中创建控件对 ... -
新风作浪博客学习(六)ios 视图切换翻页效果 .
2013-06-05 11:18 1061本文写的是视图切换,涉及到的内容有 1.实现代码添加Navi ... -
新风作浪博客学习(五)代码实现UISlider 和 UISwitch .
2013-02-18 09:15 1153本次实现的UISlider和UISwi ... -
新风作浪博客学习(四)把plist里数据显示在textField上 .
2013-02-18 09:15 918在代码实现Lable 、textFie ... -
新风作浪博客学习(三)NSBundle读取图片 plist文件和txt文件
2013-02-18 09:15 1731本文想简单介绍一下NSBundle读取图片到视图上,读取pli ... -
新风作浪博客学习(二)代码实现Lable 、textField创建界面以及键盘的处理
2013-02-18 09:15 1174今天写的是用代码实现一个简单界面,代码重复率比较高,可读性不是 ... -
新风作浪博客学习(一)plist文件读写操作
2013-02-18 09:14 1363文件plist 全名Property List,属性列表文件, ... -
GCDiscreetNotificationView提示视图
2013-06-05 11:17 559先看一下效果图: [img] ...
相关推荐
在“iPhone开发之多线程入门示例程序”中,我们主要会接触到苹果的Foundation框架中的多线程解决方案,包括NSThread、NSOperation和GCD(Grand Central Dispatch)。 首先,NSThread是Objective-C中的一个类,它...
本文将深入探讨“iPhone开发多线程”这一主题,基于提供的描述和标签,我们将关注iOS平台上的多线程概念、实现方式以及一个名为“ThreadSyncSample”的示例项目。 首先,我们需要理解什么是多线程。在单线程环境中...
- **案例**:自定义一个下载图片的`NSOperation`,并配置其为并发执行。 **3.6 配置operation之间的依赖关系** - **方法**:使用`addDependency:`方法来指定依赖关系。 - **作用**:确保任务按照正确的顺序执行,...
总结:在iPhone开发中,熟练掌握多线程技术,合理运用Object-C提供的NSOperationQueue、GCD以及NSThread,是构建高性能、响应迅速的应用的关键。理解线程安全和线程间通信,以及如何进行性能优化,对于提升应用质量...
"iPhone多线程编程"这个主题涵盖了许多关键概念和实践技巧,对于任何想要深入学习iOS开发的初学者来说,都是一块不可或缺的基石。 多线程的基本概念: 1. 主线程:应用程序的主要执行流程,负责UI更新和用户交互。...
iOS开发中的多线程技术是提升应用性能和用户体验的关键,特别是在处理耗时操作时,如网络请求、数据计算或大文件上传。本文将对多线程进行深入总结,主要涵盖线程的基本概念、使用多线程的原因以及在iPhone平台上...
在iOS开发中,有多种实现多线程的方式,包括`NSThread`、`NSOperation`以及`GCD`(Grand Central Dispatch)。 1. **NSThread** - **应用场景**:适用于需要将Objective-C中的某个方法放到独立线程中运行的情况。 ...
2. **NSOperation 和 NSOperationQueue**:这两个类提供了一种更面向对象的方式来管理多线程任务,非常适合于需要依赖关系的任务序列。 3. **Thread 类**:iOS 还提供了传统的 Thread 类来创建和管理线程。尽管这种...
10. **多线程编程**:理解GCD(Grand Central Dispatch)、NSOperation和NSOperationQueue,以实现异步任务和后台处理。 11. **推送通知**:学习如何集成Apple Push Notification Service (APNs),向用户发送实时...
本资料包主要涵盖了四个关键主题:iPhone开发进阶、iPhone入门开发经验之谈、多线程编程指南以及iPhone用户界面设计精粹。下面将对这些主题进行详细阐述。 首先,"iPhone开发进阶"这部分内容可能涉及到高级的iOS...
5. **NSInvocationOperation**和`NSInvocation`:基于`NSOperation`的轻量级多线程解决方案,可以将方法封装为操作进行异步执行。 在处理多线程时,要注意线程安全问题,如数据竞争和死锁。线程间通信(如`NSLock`...
8. **多线程编程**:为了提升性能,图片加载和处理可能在后台线程进行。课程会涉及线程同步和通信技术,如NSOperation和NSOperationQueue。 9. **用户体验优化**:课程可能会讨论如何平滑过渡效果,利用动画和过渡...
标题中的"xiancheng-tongbu-.zip_tongbu source iphone"暗示了这是一个关于iPhone平台上的线程同步(thread synchronization)程序的源代码分享。线程同步是多线程编程中的一个重要概念,它确保了在并发执行时不同...
4. **多线程**:gcd(Grand Central Dispatch)、NSOperation和NSOperationQueue是iOS中的并发工具。面试时可能会问到异步任务、线程间通信、主线程与子线程的交互,以及如何处理同步和异步操作。 5. **网络编程**...
对于多线程编程,书中有详尽的介绍,包括NSOperation和NSOperationQueue,以实现高效的异步任务处理。同时,网络编程也是iOS应用不可或缺的一部分,书中会涵盖HTTP请求、JSON解析、以及使用URLSession进行网络通信的...
四、多线程与并发 1. **GCD(Grand Central Dispatch)**:Apple提供的多任务处理库,用于异步操作和线程管理。 2. **NSOperation和NSOperationQueue**:提供更高级别的并发控制,支持依赖关系和取消操作。 五、...
Foundation框架支持多线程编程,其中`NSOperation`和`NSOperationQueue`类用于组织和执行异步任务。这些类提供了强大的调度机制,可以自动处理线程同步和任务依赖,极大地简化了并发编程的复杂度。 总之,...
GCD、NSOperation和NSOperationQueue是常用的多线程工具。理解线程安全和内存管理在多线程环境下的应用也是必要的。 **六、推送通知** Apple Push Notification service (APNs) 提供了向iOS设备发送实时消息的功能...