HBHttpImageDownloader.m 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. //
  2. // HBHttpImageDownloader.m
  3. // MyTest
  4. //
  5. // Created by weqia on 13-8-22.
  6. // Copyright (c) 2013年 weqia. All rights reserved.
  7. //
  8. #import "HBHttpImageDownloader.h"
  9. #import "HBHttpRequestCache.h"
  10. #import "HBHttpRequest.h"
  11. @interface HBHttpImageDownloader ()
  12. {
  13. HBHttpRequestCache * _cache;
  14. NSOperationQueue * _queue;
  15. NSMutableArray * _downloadUrls; //正在下载得url
  16. }
  17. @end
  18. @implementation HBHttpImageDownloader
  19. #pragma -mark 接口方法
  20. +(HBHttpImageDownloader*) shareDownlader
  21. {
  22. static HBHttpImageDownloader * downloder=nil;
  23. static dispatch_once_t onceToken;
  24. dispatch_once(&onceToken, ^{
  25. downloder=[[HBHttpImageDownloader alloc]init];
  26. });
  27. return downloder;
  28. }
  29. -(id)init
  30. {
  31. self=[super init];
  32. if(self){
  33. _cache=[HBHttpRequestCache shareCache];
  34. _queue=[[NSOperationQueue alloc]init];
  35. _queue.maxConcurrentOperationCount=2;
  36. _downloadUrls=[NSMutableArray array];
  37. }
  38. return self;
  39. }
  40. -(void) downBitmapWithURL:(NSString *)url
  41. process:(HBHttpImageDownloaderProcessBlock)process
  42. complete:(HBHttpImageDownloaderCompleteBlock)complete
  43. option:(HBHttpImageDownloaderOption)option
  44. valueReturn:(void(^)(id<HBHttpOperationDelegate>)) value
  45. {
  46. NSURL * URL=[NSURL URLWithString:url];
  47. if(URL==nil)
  48. return;
  49. __block HBHttpImageDownloaderOperation * opration;
  50. void(^block)()=^{
  51. if([_downloadUrls containsObject:url])
  52. return;
  53. @synchronized(_downloadUrls){
  54. [_downloadUrls addObject:url];
  55. }
  56. opration=[[HBHttpImageDownloaderOperation alloc]initWithURL:URL options:option process:^(NSUInteger receiveSize, long long expectedSize) {
  57. if(process){
  58. process(receiveSize,expectedSize);
  59. }
  60. } complete:^(UIImage * image, NSData * data, NSError * error, BOOL success) {
  61. @synchronized(_downloadUrls){
  62. if([_downloadUrls containsObject:url])
  63. [_downloadUrls removeObject:url];
  64. }
  65. if(image){
  66. if(option&HBHttpImageDownloaderOptionUseCache){
  67. [_cache storeBitmap:image withKey:url complete:nil];
  68. }
  69. if(complete){
  70. complete(image,data,error,success);
  71. }
  72. }else if(option&HBHttpImageDownloaderOptionRetry){
  73. [opration retry];
  74. }
  75. } cancel:^{
  76. @synchronized(_downloadUrls){
  77. if([_downloadUrls containsObject:url])
  78. [_downloadUrls removeObject:url];
  79. }
  80. }];
  81. if([_queue.operations containsObject:opration])
  82. return ;
  83. [_queue addOperation:opration];
  84. if(option&HBHttpImageDownloaderOptionLowPriority){
  85. [opration setQueuePriority:NSOperationQueuePriorityLow];
  86. }if(value){
  87. value(opration);
  88. }
  89. };
  90. if(option&HBHttpImageDownloaderOptionUseCache){
  91. /*****如果缓存里已经存在,则直接返回*****/
  92. [_cache getBitmap:url complete:^(UIImage * image){
  93. if(image){
  94. complete(image,nil,nil,YES);
  95. }else{
  96. block(); //开始执行下载
  97. }
  98. }];
  99. }else{
  100. block(); //开始执行下载
  101. }
  102. }
  103. -(void) downBitmapWithIndirectURL:(NSString *)indirectURL
  104. process:(HBHttpImageDownloaderProcessBlock)process
  105. complete:(HBHttpImageDownloaderCompleteBlock)complete
  106. option:(HBHttpImageDownloaderOption)option
  107. valueReturn:(void(^)(id<HBHttpOperationDelegate>)) value
  108. {
  109. __block HBHttpImageDownloaderOperation *opration;
  110. void(^block)()=^{
  111. HBHttpRequest * request=[HBHttpRequest shareIntance];
  112. [request getBitmapURL:indirectURL complete:^(NSString *url) {
  113. NSURL * URL=[NSURL URLWithString:url];
  114. if(URL==nil)
  115. return ;
  116. opration=[[HBHttpImageDownloaderOperation alloc]initWithURL:URL options:option process:^(NSUInteger receiveSize, long long expectedSize) {
  117. process(receiveSize,expectedSize);
  118. } complete:^(UIImage * image, NSData * data, NSError * error, BOOL success) {
  119. if(success||!image){
  120. if(option&HBHttpImageDownloaderOptionUseCache){
  121. [_cache storeBitmap:image withKey:indirectURL complete:nil];
  122. }
  123. complete(image,data,error,success);
  124. }else if(option&HBHttpImageDownloaderOptionRetry){
  125. [opration retry];
  126. }
  127. } cancel:^{
  128. }];
  129. if(value){
  130. value(opration);
  131. }
  132. [_queue addOperation:opration];
  133. if(option&HBHttpImageDownloaderOptionLowPriority){
  134. [opration setQueuePriority:NSOperationQueuePriorityLow];
  135. }
  136. }];
  137. };
  138. if(option&HBHttpImageDownloaderOptionUseCache){
  139. /*****如果缓存里已经存在,则直接返回*****/
  140. [_cache getBitmap:indirectURL complete:^(UIImage * image){
  141. if(image){
  142. complete(image,nil,nil,YES);
  143. }else{
  144. block();
  145. }
  146. }];
  147. }else{
  148. block();
  149. }
  150. }
  151. @end