將耗時(shí)操作放入指定的隊(duì)列中

OC寫法:(GCD的寫法)

.h文件:

#import?

@interface?AIQueue : NSObject

+ (void)inAISession:(dispatch_block_t)block;

+ (void)cancelOperation;

@end

.m文件:

#import "AIQueue.h"

@interface?AIQueue()

@property (nonatomic, strong) dispatch_queue_t sharedQueue;

@end

@implementation?AIQueue

static?void?*dispatchSerialQueueSpecificKey ="test";

+ (instancetype)shared {

?static?AIQueue*shared =nil;

?static?dispatch_once_t once;

? ? dispatch_once(&once, ^{

shared = [[self?alloc] init];

? ? });

?return?shared;

}

- (dispatch_queue_t)sharedQueue {

?if(_sharedQueue==nil) {

? ? ? ? _sharedQueue = dispatch_queue_create(dispatchSerialQueueSpecificKey, DISPATCH_QUEUE_SERIAL);

dispatch_queue_set_specific(_sharedQueue,dispatchSerialQueueSpecificKey, &dispatchSerialQueueSpecificKey,?NULL);

? ? }

?return?_sharedQueue;

}

+ (void)inAISession:(dispatch_block_t)block {

?if?(dispatch_get_specific(dispatchSerialQueueSpecificKey)) {

? ? ? ? block();

}else?{

? ? ? ? dispatch_async([AIQueue shared].sharedQueue, block);

? ? }

}

@end

OC寫法:(NSOperation的寫法,帶取消功能)

.h文件:

#import?

@interfaceAIQueue : NSObject

+ (void)inAISession:(dispatch_block_t)block;

+ (void)cancelOperation;

@end

.m文件:

#import "AIQueue.h"

@interface?AIQueue()

@property?(nonatomic,?strong) NSOperationQueue *sharedQueue;

@end

@implementation?AIQueue

static?void*dispatchSerialQueueSpecificKey ="test";

+ (instancetype)shared {

?static?AIQueue*shared =nil;

?static?dispatch_once_t once;

? ? dispatch_once(&once, ^{

shared = [[self?alloc] init];

? ? });

?return?shared;

}

- (NSOperationQueue *)sharedQueue {

?if(_sharedQueue==nil) {

? ? ? ? _sharedQueue= [[NSOperationQueue alloc] init];

? ? ? ? _sharedQueue.maxConcurrentOperationCount = 1;

? ? }

?return?_sharedQueue;

}

+ (void)inAISession:(dispatch_block_t)block {

?if([NSOperationQueue currentQueue] == [AIQueue shared].sharedQueue) {

? ? ? ? block();

}else{

? ? ? ? [[AIQueue shared].sharedQueue addOperationWithBlock:block];

? ? }

}

+ (void)cancelOperation {

? ? [[[AIQueue shared] sharedQueue] cancelAllOperations];

}

@end

swift寫法:(GCD的寫法)

import?Foundation

@objcMembers

openclass?ARQueue: NSObject {

? ? // 注意此方法為 static

?private?static?var?token: DispatchSpecificKey<()> = {

? ? ? ? // 初始化一個(gè) key

?letkey =DispatchSpecificKey<()>()

? ? ? ? // 在主隊(duì)列上關(guān)聯(lián)一個(gè)空元組

?return?key

? ? }()

?public?static?let?openglQueue: DispatchQueue = {

?let?queue = DispatchQueue.init(label:"test")

? ? ? ? queue.setSpecific(key:token,value: ())

?return?queue

? ? }()

?public?class?func?inOpenglSession(_block:@escaping(() ->Void)) {

?if?DispatchQueue.getSpecific(key:token) !=nil?{

? ? ? ? ? ? block()

}else?{

? ? ? ? ? ? openglQueue.async(execute: block)

? ? ? ? }

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容