看YYTransaction的說明為按声,創(chuàng)建一個YYTransaction實(shí)例洋闽,在main runloop休眠前執(zhí)行傳入的target對應(yīng)的selector蛇受。主要功能就是添加target和selector财岔,然后commit吞杭,等main runloop休眠前被調(diào)用呐籽。
那么有添加的地方锋勺,而沒有刪除的地方。
重點(diǎn)代碼
實(shí)現(xiàn)這個類的功能的主要代碼是
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庶橱,只提供了自動獲取的函數(shù):CFRunLoopGetMain()
和CFRunLoopGetCurrent()
。
CFRunLoopObserverCreate
創(chuàng)建一個基于回調(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條件時苏章,將會執(zhí)行YYRunLoopObserverCallBack函數(shù)。
CFRunLoopAddObserver
因?yàn)镃FRunLoopObserver不能直接自動添加到RunLoop中奏瞬,所以需要調(diào)用CFRunLoopAddObserver將observer添加到RunLoop中枫绅。
CFRelease(observer);
將observer添加到RunLoop后,需要將observer釋放硼端。
重載hash和isEqual方法
重載了NSObject的方法- (NSUInteger)hash
和- (BOOL)isEqual:(id)object
方法撑瞧,因?yàn)樵谑褂胻ransactionSet(為NSMutableSet對象)進(jìn)行添加對象時,需要進(jìn)行判斷新添加的對象是否與之前已經(jīng)存在的重復(fù)显蝌。所以重載了方法预伺,進(jìn)行target和select的判斷订咸。
感謝席萍萍_developer的指點(diǎn)。
疑問
只有commit添加酬诀,但是沒有刪除脏嚷。那么是不是在runloop中一直會repeat所有commit的方法。那是不是存在很多的無效操作瞒御。
// END 求高手賜教父叙。