
看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 求高手賜教。