iOS處理耗時操作一種簡單方法
阿新 • • 發佈:2019-01-28
在開發過程中,我們經常會遇到一下耗時的操作,比如說檔案的上傳、下載、壓縮、解壓縮等過程,開發過藍芽的小夥伴都知道藍芽的操作也是一個耗時的操作,尤其是那些以藍芽為工具的專案,比如說藍芽在智慧家居中的使用,這些都是耗時的操作。有時候我們需要對這些耗時的操作精準的加以控制,這時候大多數人都會想到用多執行緒來處理,那麼怎樣才能用相對簡單的程式碼來實現對這些耗時操作的控制呢?
在OC中有很多方法都能實現,這裡我只說我經常用的NSOperation和NSOperationQueue相結合的方法
這裡是通過NSOperation的子類,通過相關程式碼來控制它的狀態(如果對NSOperation的四種狀態不瞭解的童鞋可以自行補腦,這裡就不多說了)來實現,下面是宣告檔案內容
#import "HJBlockOperation.h"
#import <Foundation/Foundation.h> @class HJBlockOperation; typedef void (^continueBlock)(HJBlockOperation *con); @interface HJBlockOperation : NSOperation //仿NSOperation的四種狀態 寫出自己可以控制的對應的狀態屬性(ready狀態暫時用不到,就不寫了,其實最主要的就一個:isFinished,只有這個狀態變成YES,才證明這個操作完成了) @property(nonatomic ,assign , getter = isFinished)BOOL hjFinished; @property(nonatomic ,assign , getter = isExecuting)BOOL hjExecuting; @property(nonatomic ,assign , getter = isConcurrent)BOOL hjConcurrent; @property(nonatomic, copy) continueBlock myBlock; - (void)continueWithBlock:(continueBlock)blk; @end實現方法也是很簡單,只需要這寫程式碼
#import "HJBlockOperation.h" @implementation HJBlockOperation -(void)main { @autoreleasepool { if (self.isCancelled) { return; } _hjConcurrent =YES; [[NSOperationQueue mainQueue] addOperationWithBlock:^{ self.myBlock(self); }]; } } -(void)continueWithBlock:(continueBlock)blk { if (blk) { self.myBlock = blk; } } - (void)setHjFinished:(BOOL)hjFinished { [self willChangeValueForKey:@"isFinished"]; _hjFinished = hjFinished; [self didChangeValueForKey:@"isFinished"]; } - (void)setHjExecuting:(BOOL)hjExecuting { [self willChangeValueForKey:@"isExecuting"]; _hjExecuting = hjExecuting; [self didChangeValueForKey:@"isExecuting"]; } - (void)setHjConcurrent:(BOOL)hjConcurrent { _hjConcurrent = hjConcurrent; } @end
呼叫時候是這樣的:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 1;
NSMutableArray *operaArray = [NSMutableArray array];
for (int index = 0; index < 1; index ++) {
HJBlockOperation *blo = [[HJBlockOperation alloc] init];
[blo continueWithBlock:^(HJBlockOperation *con) {
NSLog(@"第%d條任務開始",index + 1);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"第%d條任務結束",index + 1);
//等任務結束後呼叫這句程式碼,就標明此操作已結束
blo.hjFinished = YES;
});
}];
[operaArray addObject:blo];
}
HJBlockOperation *operation = [[HJBlockOperation alloc] init];
[operation continueWithBlock:^(HJBlockOperation *con) {
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://ppt.downhot.com/d/file/p/2014/08/16/0b999aee4d45bc266637043b7cf04654.jpg"]];
NSLog(@"開始下載圖片");
if (data) {
operation.hjFinished = YES;
NSLog(@"下載完了");
dispatch_async(dispatch_get_main_queue(), ^{
_imageView.image = [UIImage imageWithData:data];
});
}
}];
[operaArray addObject:operation];
[queue addOperations:operaArray waitUntilFinished:NO];