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 : NSObject
HFSingletonH(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 VRImageDownloader
HFSingletonM(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];
}
});
}