`
gekie
  • 浏览: 157912 次
  • 性别: Icon_minigender_1
  • 来自: 海口
社区版块
存档分类
最新评论

异步加载网络数据,自定义进度条显示

阅读更多

 

//调用方式

Ajax *ajax = [[Ajax alloc]Ajax:urlStr 
		target:self 
		didFinish:@selector(showData:) 
		isAllValues:NO 
		valueForKey:@"list"
		showProgressBar:YES];
[ajax release];

//异步回调方法
-(void) showData:(NSArray*)data{
   NSLog(@"data:%@",data);
}
 

 

//
//  Ajax.h
//  live
//
//  Created by xjj xjj on 11-7-28.
//  Copyright 2011 新境界. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "UIProgressBar.h"

@interface Ajax : NSObject {

}
@property(nonatomic,assign) id target;
@property(nonatomic)SEL didFinish;
@property(nonatomic,retain) NSMutableData *buf;
@property(nonatomic,retain) NSURLConnection *connection;
@property(nonatomic,assign) BOOL isAllValues;
@property(nonatomic,assign) NSString* valueForKey;
@property(nonatomic,assign) BOOL isText;
@property(nonatomic,assign) NSString *urlStr;
@property(nonatomic,retain) UIProgressBar *progressBar;
@property(nonatomic,assign) long contentLength;
@property(nonatomic,assign) BOOL showProgressBar;

-(void)start;
-(void)hiddenProgreesBar;

/*!
@method Ajax:target:didFinish:isAllValues:valueForKey:
@discussion 异步加载某个节点数据(JSON格式)
@param _urlStr 网络数据URL
@param _target 调用者
@param _didFinish 数据加载完毕后通知动作
@param _isAllValues 是否返回所有数据 NO or YES
@param _valueForKey 加载某个节点数据
@result 初始化Ajax实例,并异步执行
*/
-(id) Ajax:(NSString*)_urlStr target:(id)_target didFinish:(SEL)_didFinish isAllValues:(BOOL)_isAllValues valueForKey:(NSString *)_valueForKey;

/*!
@method Ajax:target:didFinish:
@discussion 异步加数据(文件本格式)所有文本数据
@param _urlStr 网络数据URL
@param _target 调用者
@param _didFinish 数据加载完毕后通知动作
@result 初始化Ajax实例,并异步执行
*/
-(id) Ajax:(NSString*)_urlStr target:(id)_target didFinish:(SEL)_didFinish;

/*!
@method Ajax:target:didFinish:isAllValues:valueForKey:showProgressBar:
@discussion 异步加载某个节点数据(JSON格式)
@param _urlStr 网络数据URL
@param _target 调用者
@param _didFinish 数据加载完毕后通知动作
@param _isAllValues 是否返回所有数据 NO or YES
@param _valueForKey 加载某个节点数据
@param _showProgressBar 是否显示进度条 NO or YES
@result 初始化Ajax实例,并异步执行
*/
-(id) Ajax:(NSString*)_urlStr target:(id)_target didFinish:(SEL)_didFinish isAllValues:(BOOL)_isAllValues valueForKey:(NSString *)_valueForKey showProgressBar:(BOOL)_showProgressBar;

/*!
@method Ajax:target:didFinish:showProgressBar
@discussion 异步加数据(文件本格式)所有文本数据
@param _urlStr 网络数据URL
@param _target 调用者
@param _didFinish 数据加载完毕后通知动作
@param _showProgressBar 是否显示进度条 NO or YES
@result 初始化Ajax实例,并异步执行
*/
-(id) Ajax:(NSString*)_urlStr target:(id)_target didFinish:(SEL)_didFinish showProgressBar:(BOOL)_showProgressBar;

@end

 

实现

 

//
//  Ajax.m
//  live
//
//  Created by xjj xjj on 11-7-28.
//  Copyright 2011 新境界. All rights reserved.
//

#import "Ajax.h"
#import "JSONParser.h"
#import "UIProgressBar.h"

@implementation Ajax
@synthesize target,didFinish;
@synthesize buf;
@synthesize connection;
@synthesize isAllValues,valueForKey;
@synthesize isText;
@synthesize urlStr;
@synthesize progressBar;
@synthesize contentLength;
@synthesize showProgressBar;

-(id) Ajax:(NSString*)_urlStr target:(id)_target didFinish:(SEL)_didFinish showProgressBar:(BOOL)_showProgressBar{
	if(self){
		self.showProgressBar = _showProgressBar;
		self.urlStr = _urlStr;
		self.isText = YES;
		self.target = _target;
		self.didFinish = _didFinish;
		[self start];
	}
	return self;
}
-(id) Ajax:(NSString*)_urlStr target:(id)_target didFinish:(SEL)_didFinish{
	/*self = [super init];
	if(self){
		self.showProgressBar = YES;
		self.urlStr = _urlStr;
		self.isText = YES;
		self.target = _target;
		self.didFinish = _didFinish;
		[self start];
	}
	return self;*/
	return [self Ajax:_urlStr target:_target didFinish:_didFinish showProgressBar:YES];
}

-(id) Ajax:(NSString *)_urlStr target:(id)_target didFinish:(SEL)_didFinish isAllValues:(BOOL)_isAllValues valueForKey:(NSString *)_valueForKey showProgressBar:(BOOL)_showProgressBar{
	self = [super init];
	if(self){
		self.showProgressBar = _showProgressBar;
		self.urlStr = _urlStr;
		self.isAllValues = _isAllValues;
		self.valueForKey = _valueForKey;
		self.target = _target;
		self.didFinish = _didFinish;
		[self start];
	}
	return self;
}

-(id) Ajax:(NSString *)_urlStr target:(id)_target didFinish:(SEL)_didFinish isAllValues:(BOOL)_isAllValues valueForKey:(NSString *)_valueForKey{
	return [self Ajax:_urlStr target:_target didFinish:_didFinish isAllValues:_isAllValues valueForKey:_valueForKey showProgressBar:YES];
}

-(void)start{
	if(connection==nil){
		[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
		buf = [[NSMutableData alloc] initWithLength:0];
		NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
		[request setURL:[NSURL URLWithString:urlStr]];
		[request setHTTPMethod:@"GET"];
		connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
		
		if([target isKindOfClass:[UIViewController class]]==YES&&showProgressBar==YES){
			UIViewController *viewController = (UIViewController*)target;
			progressBar = [[UIProgressBar alloc] initWithFrame:CGRectMake(0, viewController.view.frame.size.height - 10,viewController.view.frame.size.width, 10)];
			progressBar.minValue = 0;
			
			[progressBar setLineColor:[UIColor blackColor]];
			[progressBar setProgressColor:[UIColor redColor]];	
			//[progressBar setProgressColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"3.png"]]];	
			[progressBar setProgressRemainingColor:[UIColor greenColor]];
			[viewController.view addSubview:progressBar];	
		}
		[request release];
	}
}
//收到响应时
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
	if(progressBar!=nil)
		progressBar.maxValue = response.expectedContentLength;
}
//接收数据
-(void)connection:(NSURLConnection *)aConn didReceiveData:(NSData *)data{
	[buf appendData:data];
	if(progressBar!=nil)
		progressBar.currentValue += [data length];
}
//加载失败
-(void)connection:(NSURLConnection*)aConn didFailWithError:(NSError*)error{
	NSLog(@"didFailWithError:%@",error);
	[self hiddenProgreesBar];
}
//接收完毕
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
	if(didFinish!=nil){
		if(isText)
			[target performSelector:didFinish withObject:buf];
		else{
			NSArray *data = [JSONParser parseJSON:buf isAllValues:isAllValues valueForKey:valueForKey];
			[target performSelector:didFinish withObject:data];
		}
	}
	[self hiddenProgreesBar];
}
-(void) hiddenProgreesBar{
	if(progressBar!=nil){
	//淡淡消失效果
		[UIView animateWithDuration:2
					 animations:^{
						 progressBar.alpha = 0;
					 }];
		[progressBar performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:2];
	}
	[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}
-(void)dealloc{
	[connection release];
	[buf release];
	[progressBar release];
	[super dealloc];
}
@end
  • 大小: 247.1 KB
分享到:
评论
4 楼 gekie 2011-08-29  
网络混混 写道
哥,能给弟贴下去那下吗?
小弟是新手。。

回头我给你。
3 楼 网络混混 2011-08-29  
哥,能给弟贴下去那下吗?
小弟是新手。。
2 楼 gekie 2011-08-26  
网络混混 写道
10.#import "JSONParser.h" 
11.#import "UIProgressBar.h" 

等上那找呢,老大?


网上找,开源的。
1 楼 网络混混 2011-08-26  
10.#import "JSONParser.h" 
11.#import "UIProgressBar.h" 

等上那找呢,老大?

相关推荐

    自定义进度条

    - **渐进式加载**:在大型数据加载或上传下载场景中,进度条可以展示实时进度,通过API接口获取并更新数据。 - **多任务进度**:在处理多个并发任务时,可以设计复合进度条,显示每个任务的独立进度及总体进度。 ...

    Android 自定义图片加载进度条

    在加载图片的过程中,通过监听器获取加载进度,并更新自定义进度条的进度值。 4. **布局集成** 在布局文件中,将自定义的进度条与ImageView放在一起,并通过代码设置图片加载监听器,将进度回调传递给进度条。这样...

    显示异步进度条

    根据给定的信息,本文将详细解释“显示异步进度条”的相关知识点,包括自定义进度条的形式、如何利用委托支持异步加载等技术要点。 ### 显示异步进度条 在开发用户界面时,为了提升用户体验,我们经常需要在执行...

    自定义页面加载中效果的进度条

    在创建自定义进度条时,我们首先需要了解ProgressBar的基本属性和用法。例如,我们可以调整其颜色、大小、样式等。在XML布局文件中,可以设置`android:progressDrawable`属性来改变默认的进度条外观。这个属性接受一...

    异步加载进度条案例素材.zip

    "异步加载进度条案例素材.zip" 包含了一个名为 "Loading Screen.unitypackage" 的资源包,这个包里可能包含了实现异步加载进度条的示例场景、脚本和其他相关素材。 首先,理解Unity中的异步加载机制。Unity使用`...

    安卓进度条loadingprogress相关-自定义进度条效果.rar

    在Android开发中,自定义进度条(loadingprogress)是一个常见的需求,它可以帮助用户了解应用程序的运行状态,如数据加载、文件下载等。本资源“安卓进度条loadingprogress相关-自定义进度条效果.rar”提供了几个...

    WPF中ItemsControl的异步加载

    为了解决这个问题,我们可以利用异步加载技术来优化ItemsControl的数据绑定。本文将深入探讨如何在WPF中实现ItemsControl的异步加载。 首先,我们需要了解WPF的数据绑定机制。在WPF中,数据绑定是通过依赖项属性...

    加载图片时进度条

    6. **异步加载** 为了不影响界面的响应速度,图片加载通常在后台线程进行,而进度条的更新则需要在主线程进行,以确保用户界面的平滑刷新。 7. **性能优化** 对于大量图片的加载,可以考虑使用预加载策略,如懒...

    Dialog自定义对话框加载网络数据

    4. **数据显示** 将网络获取的数据展示在对话框的列表中,需要使用`ListView`或`RecyclerView`。在自定义对话框布局中添加这些视图,并创建适配器(Adapter)以绑定数据。适配器通常继承自`BaseAdapter`,并覆盖`...

    unity场景异步加载进度条小场景

    "Mad Level Manager"可能是一个专门用于管理场景切换的插件或工具,它提供了方便的接口和逻辑,帮助开发者更轻松地实现异步加载并显示进度条。通常,这样的工具会包含一个预设的“加载屏幕”场景,该场景包含了一个...

    jQuery数据加载进度条代码.zip

    在本文中,我们将深入探讨如何使用jQuery实现数据加载进度条效果。这个代码示例是基于jQuery库的2.1.0版本,包含了四种不同的进度条动画特效,为用户提供了丰富的视觉体验,使得网页上的数据加载过程更加友好和吸引...

    flex 异步加载tree

    AsyncTree是Flex中的一个自定义组件,它允许开发者构建能够异步加载数据的树形结构。这通常用于展示大量数据或者需要动态加载子节点的情况。通过这种方式,可以显著提高应用的性能和用户体验。 ### 二、代码解析 #...

    酷炫的html5进度条加载动画_加载进度条动画特效.zip

    此外,`Promise`和`async/await`语法在现代JavaScript中也被广泛用于处理异步操作,它们可以很好地与进度条结合,提供更精确的加载反馈。例如,当进行大文件上传或下载时,可以使用`fetch` API与进度事件配合,实时...

    gridview异步加载

    当涉及到图像数据时,尤其是在本地和网络环境下,异步加载技术变得至关重要。这是因为直接在主线程中加载大图或网络图片会消耗大量资源,可能导致应用卡顿甚至ANR(Application Not Responding)错误。因此,...

    图片异步加载(带进度条)+二级缓存+图片手势缩放+ViewPaper+设置壁纸

    这个话题“图片异步加载(带进度条)+二级缓存+图片手势缩放+ViewPaper+设置壁纸”涵盖了许多Android应用中常见的图片处理技术。下面将详细解释这些知识点。 1. **图片异步加载**: 在Android应用中,为了提供流畅...

    安卓自定义圆形进度条

    在实际开发中,可以根据需求进行扩展,比如增加文字显示、支持双向进度、自定义动画效果等。自定义组件不仅可以提升应用的个性化程度,也是提高代码复用性和可维护性的重要手段。通过不断实践和学习,你将能更好地...

    酷炫的html5进度条加载动画_加载进度条动画特效

    // 假设我们有一个加载数据的异步函数 async function loadData() { for (let i = 0; i ; i += 10) { await new Promise(resolve =&gt; setTimeout(resolve, 500)); // 模拟加载延迟 updateProgress(i); } } load...

    C# Winform进度条 数据加载等待控件

    "C# Winform进度条 数据加载等待控件"就是这样一个组件,它在数据加载或执行耗时操作时提供视觉反馈,告诉用户程序仍在运行,并且预计何时会完成。 这个控件的设计原则是简单易用,开发者只需一行代码就能快速地将...

Global site tag (gtag.js) - Google Analytics