(转载)多线程下文件
2011-07-25 17:01
204 查看
(转载自COCOACHINA)
NSString*FDownLoadDefaultFile; //下载异常状态的默认文件 NSString*FDownLoadLocalFilePath; //下载到本地的保存路径 NSIntegerFDownLoadFileCount; //当前下载的文件总数 NSInteger FDownLoadID; //下载序列ID NSMutableArray*FDownLoadFileArr; //下载到本地的文件 NSMutableArray*FDownLoadNetworkFilePathArr; //需要下载到本地的网络文件路径 NSCondition*FDownloadLockCondition; //线程锁 //下载文件 //多线程下载文件 -(void)DownloadFileByThread : (NSArray *)AFileArr //需要下载的文件集合数组 ADownloadDirPath : (NSString *)ADownloadFilePath //需要下载到本地的目录路径,结尾为“/” ADownloadDefaultFileURL : (NSString *)ADownloadDeaultFileURL; //如果需要下载的文件不存在,则需要下载的默认文件 //下载主线程 -(void)DownloadMainThread : (NSArray *)ADataArr; //传递到线程中的数据集合, //位置0=本地下载目录 //位置1=下载文件地址 //位置2=默认下载文件 //位置3=文件所属的位置索引号 .m -(void)SetDownloadFileID : (NSInteger)AID { FDownLoadID= AID; } -(void)DownloadFileByThread : (NSArray *)AFileArr ADownloadDirPath : (NSString *)ADownloadFilePath ADownloadDefaultFileURL : (NSString *)ADownloadDeaultFileURL { NSInteger AFileCount = [AFileArr count]; NSString *ALocalFile = ADownloadFilePath; NSString *AFileName; NSString *AFileURL; NSString *ADefaultFile; NSMutableArray*ADataArr; [[NSURLCachesharedURLCache] removeAllCachedResponses]; FDownLoadNetworkFilePathArr= [[NSMutableArrayalloc] initWithArray:AFileArr]; FDownLoadFileArr = [[NSMutableArray alloc] initWithCapacity:AFileCount]; FDownLoadFileCount= 0; FDownloadLockCondition= [[NSConditionalloc] init]; for (int i = 0; i < AFileCount; i++) { [FDownLoadFileArraddObject:@""]; } for (int i = 0; i < AFileCount; i++) { AFileURL = [[NSString alloc] initWithString: [AFileArr objectAtIndex : i]]; AFileName = [ALocalFile stringByAppendingString:[self GetFileName:AFileURL]]; ADataArr = [[NSMutableArray alloc] initWithCapacity:3]; [ADataArr addObject:ALocalFile]; if([[NSFileManagerdefaultManager] fileExistsAtPath:AFileName] == NO) { //NSLog(@"%@",AFileURL); [ADataArr addObject:AFileURL]; [ADataArr addObject:ADownloadDeaultFileURL]; [ADataArr addObject:[[NSStringalloc] initWithFormat:@"%d",i]]; [NSThreaddetachNewThreadSelector:@selector(DownloadMainThread:) toTarget:selfwithObject:ADataArr]; [ADataArr release]; } else { //NSLog(@"%@",AFileName); if (AFileURL == @"") { ADefaultFile = [ALocalFile stringByAppendingString:[self GetFileName:ADownloadDeaultFileURL]]; if ([[NSFileManager defaultManager] fileExistsAtPath:ADefaultFile] == NO) { [ADataArr addObject:ADownloadDeaultFileURL]; [ADataArr addObject:ADownloadDeaultFileURL]; [ADataArr addObject:[[NSStringalloc] initWithFormat:@"%d",i]]; [NSThreaddetachNewThreadSelector:@selector(DownloadMainThread:) toTarget:selfwithObject:ADataArr]; [ADataArr release]; } else { FDownLoadFileCount++; [FDownLoadFileArrreplaceObjectAtIndex:i withObject:ADefaultFile]; //[FDownLoadFileArr addObject:ADefaultFile]; } } else { FDownLoadFileCount++; [FDownLoadFileArrreplaceObjectAtIndex:i withObject:AFileName]; //[FDownLoadFileArr setValue:AFileName forKey:[[NSString alloc] initWithFormat:@"%d",i]]; //[FDownLoadFileArr addObject:AFileName]; } } } if(FDownLoadFileCount== [FDownLoadNetworkFilePathArrcount]) { //完成全部下载 [self.delegate DownLoadFileDidFinish:FDownLoadFileArr AID : FDownLoadID]; [FDownLoadNetworkFilePathArrrelease]; [FDownLoadFileArrrelease]; [FDownloadLockConditionrelease]; } } -(void)DownloadMainThread : (NSArray *)ADataArr { NSString *ALocalFile = [ADataArr objectAtIndex:0]; //NSLog(@"%@",[ADataArr objectAtIndex:1]); NSURL*AURL = [[NSURLalloc] initWithString:[ADataArr objectAtIndex:1]]; NSData *AFileData = [[NSData alloc] initWithContentsOfURL:AURL]; if (AFileData != nil) { ALocalFile = [ALocalFile stringByAppendingString:[self GetFileName:[ADataArr objectAtIndex:1]]]; //NSLog(@"%@",ALocalFile); [AFileData writeToFile:ALocalFile atomically:YES]; } else{ //不存在指定路径的文件,使用默认文件 NSString *ADefaultFile = [ALocalFile stringByAppendingString:[self GetFileName:[ADataArr objectAtIndex:2]]]; if ([[NSFileManager defaultManager] fileExistsAtPath:ADefaultFile] == NO) { [AURL release]; [AFileData release]; AURL = [[NSURLalloc] initWithString:[ADataArr objectAtIndex:2]]; AFileData = [[NSData alloc] initWithContentsOfURL:AURL]; if (AFileData != nil) { ALocalFile = [ALocalFile stringByAppendingString:[self GetFileName:[ADataArr objectAtIndex:1]]]; [AFileData writeToFile:ALocalFile atomically:YES]; } else { ALocalFile = [DocumentPathstringByAppendingString:@"default.png"]; } } } //NSLog(@"ADataArr = %@",[ADataArr objectAtIndex:3]); [FDownloadLockConditionlock]; //上锁 FDownLoadFileCount++; [FDownLoadFileArrreplaceObjectAtIndex:[[ADataArr objectAtIndex:3] intValue] withObject:ALocalFile]; [FDownloadLockConditionunlock]; //解锁 [AURL release]; [ALocalFile release]; [AFileData release]; if(FDownLoadFileCount== [FDownLoadNetworkFilePathArrcount]) { //完成全部下载 [self.delegate DownLoadFileDidFinish:FDownLoadFileArr AID : FDownLoadID]; [FDownLoadNetworkFilePathArrrelease]; [FDownLoadFileArrrelease]; [FDownloadLockConditionrelease]; } }
相关文章推荐
- [转载]http协议 文件下载原理及多线程断点续传
- java 计算文件目录下文件总大小的几种多线程并发实现
- 分布式文件系统:Getting Started with Hadoop(转载:无法标示作者,请指出)
- 【转载】Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题
- WINCE6.0文件系统及存储管理器 --转载
- 使用多线程使软件界面具有较好的响应性(转载)
- 深入浅出多线程(5)以并行包线程池为例说说线程池的设计需求及使用[转载]
- 【转载】Windows和linux传送文件的方法
- c#遍历一个文件夹下的所有文件包括子文件夹(转载)
- [转载]ipch文件夹和.sdf文件是什么 vs2010
- 转载:INF文件简介
- [转载].MIF文件生成工具
- ORA-01113:文件n需要介质恢复 (转载)
- 12-关于NFS中Exports配置文件格式与权限的分析(转载自网络)
- Web.config配置文件详解(转载)
- 代码实现文件驱动的安装 (转载)
- 参考多线程读写文件(转,未测试)
- 在一般处理文件中访问Session需要添加IRequiresSessionState(转载)
- 《Java虚拟机原理图解》1.5、 class文件中的方法表集合--method方法在class文件中是怎样组织的 --转载收藏
- 多线程的对比与案例(计算目录下文件的大小)