基于网络的客户端开发技巧——第七篇后台上传
2011-05-23 11:39
337 查看
这里说的后台上传当然不是真的后台上传,只是在开启程序的情况下不影响操作的上传。基本的思想就是开启一个线程,不断的处理上传操作。这里用队列比较方便一些。主要做以下几步:第一步:实现一个自定义类,继承NSObject
@interface MinroadOperation : NSObject { NSOperationQueue *operationQueue; } - (void)addOperation:(NSDictionary *)_dic; - (void)reStartOperation:(NSDictionary *)_dic; @property (retain,nonatomic) NSOperationQueue *operationQueue; @end
@implementation MinroadOperation @synthesize operationQueue; - (id)init { self = [super init]; if (self) { self.operationQueue = [[NSOperationQueue alloc] init]; [self.operationQueue setMaxConcurrentOperationCount:2];//设置同时进行的线程数量,建议为2。 } return self; }- (void)addOperation:(NSDictionary *)_dic{//保存上传列表到nsuserdefaultsNSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];if ([userDefault valueForKey:@"upload"] == nil) {NSMutableDictionary *dic = [NSMutableDictionarydictionaryWithObjectsAndKeys:[NSMutableArrayarrayWithObject:_dic],@"upload",nil];[userDefault registerDefaults:dic];[userDefault synchronize];}else {NSArray *array = [userDefault valueForKey:@"upload"];NSMutableArray *arr = [[NSMutableArray alloc] initWithArray:array];[arr addObject:_dic];[userDefault setObject:arr forKey:@"upload"];[arr release];[userDefault synchronize];}//添加到队列NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:selfselector:@selector(myTaskMethod:) object:_dic];[self.operationQueue addOperation:theOp];[theOp release];//更新UI}- (void)reStartOperation:(NSDictionary *)_dic{//从userdefaults读取数据,并添加到队列NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];NSArray *array = [userDefault valueForKey:@"upload"];NSMutableArray *arr = [[NSMutableArray alloc] initWithArray:array];int i = (int)[arr indexOfObject:_dic];if (i == NSNotFound) {return;}NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:[arr objectAtIndex:i]];[dic setValue:[NSNumber numberWithInt:0] forKey:@"state"];//0 等待上传 1 上传中 2 失败[arr replaceObjectAtIndex:i withObject:dic];[userDefault setValue:arr forKey:@"upload"];[userDefault synchronize];NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:selfselector:@selector(myTaskMethod:) object:dic];[self.operationQueue addOperation:theOp];[theOp release];//更新UI}- (void)myTaskMethod:(id)_obj{//实现上传方法//成功调用[self performSelectorOnMainThread:@selector(taskMethodDidFinish:) withObject:nil waitUntilDone:YES];//失败调用[self performSelectorOnMainThread:@selector(taskMethodDidFailed:) withObject:nil waitUntilDone:YES];}- (void)taskMethodDidFailed:(id)_obj{//失败的任务更改状态之后保存NSDictionary *tdic = [_obj retain];NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:tdic];[dic setValue:[NSNumber numberWithInt:1] forKey:@"state"];NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];NSArray *array = [userDefault valueForKey:@"upload"];NSMutableArray *arr = [[NSMutableArray alloc] initWithArray:array];int _index = (int)[arr indexOfObject:dic];if (_index != NSNotFound) {NSMutableDictionary *tmp = [NSMutableDictionary dictionaryWithDictionary:[arr objectAtIndex:_index]];[tmp setValue:[NSNumber numberWithInt:2] forKey:@"state"];//0 等待上传 1 上传中 2 失败[arr replaceObjectAtIndex:_index withObject:tmp];}[userDefault setObject:arr forKey:@"upload"];[arr release];[userDefault synchronize];//更新UI}- (void)taskMethodDidFinish:(id)_obj{//成功的任务从userdefaults中删除NSDictionary *tdic = [_obj retain];NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:tdic];[dic setValue:[NSNumber numberWithInt:1] forKey:@"state"];NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];NSArray *array = [userDefault valueForKey:@"upload"];NSMutableArray *arr = [[NSMutableArray alloc] initWithArray:array];int _index = (int)[arr indexOfObject:dic];if (_index != NSNotFound) {[arr removeObjectAtIndex:_index];}[userDefault setObject:arr forKey:@"upload"];[arr release];[userDefault synchronize];//更新UI}
- (void)dealloc{[operationQueue release];[super dealloc];}@end第二步:在appdelegate中初始化一个MinroadOperation对象,添加的时候用addOperation(),重新开始的时候用reStartOperation()。第三步:在程序重新开启的时候启动队列。同时有一点不确认,就是从后台返回貌似队列会继续进行,也就是说进入后台的时候队列处在等待状态。需要注意的几点:1. NSInvocationOperation的cancel方法只是设置一个标识,在进入队列的时候判断是否为true,从而判断是否进行。如果想取消NSInvocationOperation,可以尝试继承它。2.避免无限重试。
相关文章推荐
- iphone基于网络的客户端开发技巧——后台上传
- 基于网络的客户端开发技巧——第一篇
- 基于网络的客户端开发技巧——第二篇Webview及正则
- 基于网络的客户端开发技巧——第三篇上下拖动切换页面
- 基于网络的客户端开发技巧——第四篇多账号的处理与注重细节
- 基于网络的客户端开发技巧——第五篇透过现象看本质
- 基于网络的客户端开发技巧——第三篇上下拖动切换页面
- 基于Hadoop开发网络云盘系统客户端界面设计初稿
- 基于Hadoop开发网络云盘系统客户端界面设计初稿
- Android开发之网络请求通信专题(二):基于HttpClient的文件上传下载
- 基于Hadoop开发网络云盘系统客户端界面设计初稿
- 基于车载 流媒体播放器的客户端开发
- 基于libcap的网络包分析问题集锦(http post方式上传文件)
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- 使用jQuery开发一个基于HTML5的漂亮图片拖拽上传web应用
- GeoServer地图开发解决方案(五):基于Silverlight技术的地图客户端实现
- ios开发网络学习十二:NSURLSession实现文件上传
- 网络后台开发工具 tcpdump(抓包) route(路由) nslookup和host(路由) md5sum(版本校验)
- Java后台服务器接收IOS客户端上传的图片
- Java网络编程实践和总结 --- 基于TCP的Socket编程之实现文件上传和下载服务