YYTransaction的學(xué)習(xí)

圖片來(lái)之網(wǎng)絡(luò)

看YYTransaction的說(shuō)明為,創(chuàng)建一個(gè)YYTransaction實(shí)例,在main runloop休眠前執(zhí)行傳入的target對(duì)應(yīng)的selector。主要功能就是添加target和selector,然后commit,等main runloop休眠前被調(diào)用。
那么有添加的地方,而沒(méi)有刪除的地方。

重點(diǎn)代碼

實(shí)現(xiàn)這個(gè)類的功能的主要代碼是

transactionSet = [NSMutableSet new];
CFRunLoopRef runloop = CFRunLoopGetMain();
CFRunLoopObserverRef observer;
        
observer = CFRunLoopObserverCreate(CFAllocatorGetDefault(),
                                           kCFRunLoopBeforeWaiting | kCFRunLoopExit,
                                           true,      // repeat
                                           0xFFFFFF,  // after CATransaction(2000000)
                                           YYRunLoopObserverCallBack, NULL);
CFRunLoopAddObserver(runloop, observer, kCFRunLoopCommonModes);
CFRelease(observer);

將需要回調(diào)的方法添加到CFRunLoopObserverRef中。

CFRunLoopGetMain

蘋果不允許直接創(chuàng)建RunLoop,只提供了自動(dòng)獲取的函數(shù):CFRunLoopGetMain()CFRunLoopGetCurrent()。

CFRunLoopObserverCreate

創(chuàng)建一個(gè)基于回調(diào)函數(shù)的CFRunLoopObserver。

CF_EXPORT CFRunLoopObserverRef CFRunLoopObserverCreate(CFAllocatorRef allocator, CFOptionFlags activities, Boolean repeats, CFIndex order, CFRunLoopObserverCallBack callout, CFRunLoopObserverContext *context);

CFOptionFlags的枚舉內(nèi)容有:

/* Run Loop Observer Activities */
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
    kCFRunLoopEntry = (1UL << 0),
    kCFRunLoopBeforeTimers = (1UL << 1),
    kCFRunLoopBeforeSources = (1UL << 2),
    kCFRunLoopBeforeWaiting = (1UL << 5),
    kCFRunLoopAfterWaiting = (1UL << 6),
    kCFRunLoopExit = (1UL << 7),
    kCFRunLoopAllActivities = 0x0FFFFFFFU
};

當(dāng)在kCFRunLoopBeforeWaiting和kCFRunLoopExit條件時(shí),將會(huì)執(zhí)行YYRunLoopObserverCallBack函數(shù)。

CFRunLoopAddObserver

因?yàn)镃FRunLoopObserver不能直接自動(dòng)添加到RunLoop中,所以需要調(diào)用CFRunLoopAddObserver將observer添加到RunLoop中。

CFRelease(observer);

將observer添加到RunLoop后,需要將observer釋放。

重載hash和isEqual方法

重載了NSObject的方法- (NSUInteger)hash- (BOOL)isEqual:(id)object方法,因?yàn)樵谑褂胻ransactionSet(為NSMutableSet對(duì)象)進(jìn)行添加對(duì)象時(shí),需要進(jìn)行判斷新添加的對(duì)象是否與之前已經(jīng)存在的重復(fù)。所以重載了方法,進(jìn)行target和select的判斷。
感謝席萍萍_developer的指點(diǎn)。

疑問(wèn)

只有commit添加,但是沒(méi)有刪除。那么是不是在runloop中一直會(huì)repeat所有commit的方法。那是不是存在很多的無(wú)效操作。

// END 求高手賜教。

最后編輯于
?著作權(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)容