ios异步中实现按序下载队列
来源:互联网 发布:淘宝历史价格查询插件 编辑:程序博客网 时间:2024/05/22 03:51
HFSingleonH 头件这里写链接内容
#define HFSingletonH(name) + (instancetype)shared##name;// .m文件#if __has_feature(objc_arc)#define HFSingletonM(name) \static id _instace; \\+ (id)allocWithZone:(struct _NSZone *)zone \{ \static dispatch_once_t onceToken; \dispatch_once(&onceToken, ^{ \_instace = [super allocWithZone:zone]; \}); \return _instace; \} \\+ (instancetype)shared##name \{ \static dispatch_once_t onceToken; \dispatch_once(&onceToken, ^{ \_instace = [[self alloc] init]; \}); \return _instace; \} \\- (id)copyWithZone:(NSZone *)zone \{ \return _instace; \}#else#define HFSingletonM(name) \static id _instace; \\+ (id)allocWithZone:(struct _NSZone *)zone \{ \static dispatch_once_t onceToken; \dispatch_once(&onceToken, ^{ \_instace = [super allocWithZone:zone]; \}); \return _instace; \} \\+ (instancetype)shared##name \{ \static dispatch_once_t onceToken; \dispatch_once(&onceToken, ^{ \_instace = [[self alloc] init]; \}); \return _instace; \} \\- (id)copyWithZone:(NSZone *)zone \{ \return _instace; \} \\- (oneway void)release { } \- (id)retain { return self; } \- (NSUInteger)retainCount { return 1;} \- (id)autorelease { return self;}#endif
头文件
#import <Foundation/Foundation.h>#include "SingletonMacro.h"@interface VRImageDownloader : NSObjectHFSingletonH(VRImageDownloader) //单例- (void) addDownTasks:(id)item target:(id)tag completed:(void (^)(int result, char *filename, id tag))completedBlock;@end
实现
#include <pthread.h>pthread_mutex_t _downMutex;typedef void (^completedBlock)(int result, char *filename, id tag);@interface VRImageDownloader ()@property (strong, nonatomic) dispatch_queue_t barrierQueue;@property (strong, nonatomic) NSThread *downThread;@property (strong, nonatomic) NSMutableArray *arrTask;@end@implementation VRImageDownloaderHFSingletonM(VRImageDownloader)- (instancetype) init{ self = [super init]; if(self){ [self setup]; } return self;}- (void) setup{ pthread_mutex_init(&_downMutex, NULL); _barrierQueue = dispatch_queue_create("com.xxx.socketdownQueue", DISPATCH_QUEUE_CONCURRENT); _arrTask = [[NSMutableArray alloc] initWithCapacity:10]; _downThread = [[NSThread alloc] initWithTarget:self selector:@selector(DownThumbThread) object:nil]; [_downThread start];}- (void) DownThumbThread{ [[NSThread currentThread] setName:@"DownThread"]; __weak __typeof(self)wself = self; int downRet; while(true){ //取队列中有没有数据,如果没有,则Sleep __block NSDictionary *dic; dispatch_barrier_sync(wself.barrierQueue, ^{ if([wself.arrTask count] >0){ dic = wself.arrTask[0]; [wself.arrTask removeObjectAtIndex:0]; } }); if(dic !=nil){ //下载 completedBlock completedBlock ; Model *model; model = dic[@"item"]; completedBlock = dic[@"block"]; XXXManager *cloudManager = [[XXXManager alloc] init]; pthread_mutex_lock(&_downMutex); //由于下载是异步的,等待上一次完成, [cloudManager requestDown:@"" mediaModel:model progressBlock:^(int progress) { dispatch_async_on_main_queue(^{ if(completedBlock){ completedBlock(progress, (char*)"0", model); } }); } completion:^(Model *sqlModel, NSError *error) { dispatch_async_on_main_queue(^{ if(completedBlock){ completedBlock(downRet, (char*)"", model); } pthread_mutex_unlock(&_downMutex);//上一次完成了 }); }]; usleep(100); //让线程调度一下,内存不会自动释放下 }else{ usleep(10000); } dic = nil; }}- (void) addDownTasks:(id)item target:(id)tag completed:(void (^)(int result, char *filename, id tag))completedBlock{ __weak __typeof(self)wself = self; __block int ret=0; dispatch_barrier_sync(wself.barrierQueue, ^{ NSDictionary *dic; id obj; for(obj in item){ dic = @{@"tag":tag, @"block":completedBlock,@"item":obj}; [_arrTask addObject:dic]; } });}
阅读全文
0 0
- ios异步中实现按序下载队列
- iOS 利用 ASI 实现的异步队列下载文件
- IOS---利用ASIHTTPRequest实现异步队列
- 多异步按序执行
- ASINetworkQueue异步下载队列
- iOS实现NSURLConnection进行异步下载
- ASIHTTPRequest实现异步队列
- 异步实现消息队列
- IOS异步下载
- iOS 异步下载图片
- iOS 异步下载图片
- ios异步下载
- IOS 异步下载图片
- iOS 异步下载图片
- IOS可以实现异步下载但是无网条件下不行
- 网易视频云分享:消息队列设计中如何保证同一用户的消息按序处理
- 简单实现异步下载
- JS 异步队列的实现
- 从外界跳转到APP 的时候导航栏会闪一下
- Word表格不能调整宽度的解决方法
- HDU 1281 棋盘游戏 二分匹配 匈牙利算法
- Spark操作hive遇到的问题
- 安卓串口读写
- ios异步中实现按序下载队列
- 如何解决aar中的第三方依赖无法调用问题
- Python判断--文件和文件夹--是否存在的方法
- ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting B
- 浅谈Object.defineProperty()
- intellij idea打开打开自己copy或者下载的项目
- 音视频编解码简易介绍
- 第23讲项目6-前导0的数字
- AdjustWindowRect 与 SetWindowPos