版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2017.08.22 |
前言
NSRunloop
是OC Foundation
框架中非常重要的一個類叠必,很多時候我們會使用它抵皱,但是未必對其有深入的了解帖汞,接下來幾篇我就會帶著大家重新學(xué)習(xí)一下NSRunloop
這個類,從簡單到復(fù)雜砾肺,從基本到深化挽霉,我會一步步的走完。希望對大家有所幫助变汪。感興趣的可以看我上一篇侠坎。
1. NSRunloop簡單細(xì)說(一)—— 整體了解
一、 @property(class, readonly, strong) NSRunLoop *currentRunLoop;
該屬性的作用是:獲取當(dāng)前線程的runloop模式裙盾,是一個只讀屬性实胸。這里還要注意:
- 如果線程不存在運(yùn)行循環(huán),則創(chuàng)建并返回一個番官。
下面看一下代碼庐完。
- (void)demoCurrentRunLoop
{
NSLog(@"currentRunLoop1 = %@", [NSRunLoop currentRunLoop]);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"currentRunLoop2 = %@", [NSRunLoop currentRunLoop]);
});
}
下面我們看輸出,這個輸出還是很長的徘熔。
currentRunLoop1
2017-08-22 23:26:46.152 JJOC[3275:96954] currentRunLoop1 = <CFRunLoop 0x6000001756c0 [0x1058bbe40]>{wakeup port = 0x2103, stopped = false, ignoreWakeUps = true,
current mode = UIInitializationRunLoopMode,
common modes = <CFBasicHash 0x60000005d850 [0x1058bbe40]>{type = mutable set, count = 2,
entries =>
0 : <CFString 0x107e4c6c0 [0x1058bbe40]>{contents = "UITrackingRunLoopMode"}
2 : <CFString 0x105893970 [0x1058bbe40]>{contents = "kCFRunLoopDefaultMode"}
}
,
common mode items = <CFBasicHash 0x60000005d700 [0x1058bbe40]>{type = mutable set, count = 16,
entries =>
0 : <CFRunLoopSource 0x608000175480 [0x1058bbe40]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x0, callout = PurpleEventSignalCallback (0x10ae9a723)}}
1 : <CFRunLoopObserver 0x608000136800 [0x1058bbe40]>{valid = Yes, activities = 0x1, repeats = Yes, order = -2147483647, callout = _wrapRunLoopWithAutoreleasePoolHandler (0x106f83de6), context = <CFArray 0x60800005f410 [0x1058bbe40]>{type = mutable-small, count = 0, values = ()}}
2 : <CFRunLoopObserver 0x6080001368a0 [0x1058bbe40]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2147483647, callout = _wrapRunLoopWithAutoreleasePoolHandler (0x106f83de6), context = <CFArray 0x60800005f410 [0x1058bbe40]>{type = mutable-small, count = 0, values = ()}}
3 : <CFRunLoopSource 0x608000176080 [0x1058bbe40]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x600000136bc0, callout = __handleEventQueue (0x1077840d0)}}
4 : <CFRunLoopSource 0x608000176e00 [0x1058bbe40]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 29187, subsystem = 0x10c90bf60, context = 0x6000000ba460}}
5 : <CFRunLoopSource 0x600000176500 [0x1058bbe40]>{signalled = Yes, valid = Yes, order = 0, context = <CFRunLoopSource context>{version = 0, info = 0x600000262700, callout = FBSSerialQueueRunLoopSourceHandler (0x10c526ca6)}}
7 : <CFRunLoopSource 0x600000175cc0 [0x1058bbe40]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 1, info = 0x3703, callout = PurpleEventCallback (0x10ae9cc58)}}
9 : <CFRunLoopObserver 0x608000136300 [0x1058bbe40]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2000000, callout = _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv (0x106320ac4), context = <CFRunLoopObserver context 0x0>}
10 : <CFRunLoopObserver 0x608000136260 [0x1058bbe40]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2001000, callout = _afterCACommitHandler (0x106fb64d7), context = <CFRunLoopObserver context 0x7fa063f00ac0>}
11 : <CFRunLoopSource 0x608000175c00 [0x1058bbe40]>{signalled = Yes, valid = Yes, order = -2, context = <CFRunLoopSource context>{version = 0, info = 0x60000005eae0, callout = __handleHIDEventFetcherDrain (0x10778588c)}}
12 : <CFRunLoopSource 0x608000176140 [0x1058bbe40]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 23311, subsystem = 0x107e12b10, context = 0x0}}
13 : <CFRunLoopObserver 0x608000136080 [0x1058bbe40]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 1999000, callout = _beforeCACommitHandler (0x106fb645c), context = <CFRunLoopObserver context 0x7fa063f00ac0>}
14 : <CFRunLoopSource 0x608000176a40 [0x1058bbe40]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 27403, subsystem = 0x107e294f0, context = 0x60800003e280}}
18 : <CFRunLoopSource 0x600000175780 [0x1058bbe40]>{signalled = No, valid = Yes, order = 0, context = <CFMachPort 0x60000015b6a0 [0x1058bbe40]>{valid = Yes, port = 1c03, source = 0x600000175780, callout = _ZL27change_notify_port_callbackP12__CFMachPortPvlS1_ (0x10627f9f7), context = <CFMachPort context 0x0>}}
21 : <CFRunLoopObserver 0x600000136d00 [0x1058bbe40]>{valid = Yes, activities = 0x20, repeats = Yes, order = 0, callout = _UIGestureRecognizerUpdateObserver (0x1074adb1b), context = <CFRunLoopObserver context 0x6000000da470>}
22 : <CFRunLoopSource 0x600000175900 [0x1058bbe40]>{signalled = No, valid = Yes, order = 0, context = <CFMachPort 0x60000015b5f0 [0x1058bbe40]>{valid = Yes, port = 2503, source = 0x600000175900, callout = _ZL26power_notify_port_callbackP12__CFMachPortPvlS1_ (0x10627fb06), context = <CFMachPort context 0x0>}}
}
,
modes = <CFBasicHash 0x60000005d820 [0x1058bbe40]>{type = mutable set, count = 5,
entries =>
2 : <CFRunLoopMode 0x6000001933f0 [0x1058bbe40]>{name = UITrackingRunLoopMode, port set = 0x2703, queue = 0x600000175c00, source = 0x6000001d1580 (not fired), timer port = 0x2903,
sources0 = <CFBasicHash 0x60000005d5b0 [0x1058bbe40]>{type = mutable set, count = 4,
entries =>
0 : <CFRunLoopSource 0x608000175480 [0x1058bbe40]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x0, callout = PurpleEventSignalCallback (0x10ae9a723)}}
3 : <CFRunLoopSource 0x608000176080 [0x1058bbe40]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x600000136bc0, callout = __handleEventQueue (0x1077840d0)}}
4 : <CFRunLoopSource 0x600000176500 [0x1058bbe40]>{signalled = Yes, valid = Yes, order = 0, context = <CFRunLoopSource context>{version = 0, info = 0x600000262700, callout = FBSSerialQueueRunLoopSourceHandler (0x10c526ca6)}}
5 : <CFRunLoopSource 0x608000175c00 [0x1058bbe40]>{signalled = Yes, valid = Yes, order = -2, context = <CFRunLoopSource context>{version = 0, info = 0x60000005eae0, callout = __handleHIDEventFetcherDrain (0x10778588c)}}
}
,
sources1 = <CFBasicHash 0x60000005d580 [0x1058bbe40]>{type = mutable set, count = 6,
entries =>
0 : <CFRunLoopSource 0x608000176e00 [0x1058bbe40]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 29187, subsystem = 0x10c90bf60, context = 0x6000000ba460}}
1 : <CFRunLoopSource 0x608000176140 [0x1058bbe40]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 23311, subsystem = 0x107e12b10, context = 0x0}}
3 : <CFRunLoopSource 0x600000175780 [0x1058bbe40]>{signalled = No, valid = Yes, order = 0, context = <CFMachPort 0x60000015b6a0 [0x1058bbe40]>{valid = Yes, port = 1c03, source = 0x600000175780, callout = _ZL27change_notify_port_callbackP12__CFMachPortPvlS1_ (0x10627f9f7), context = <CFMachPort context 0x0>}}
4 : <CFRunLoopSource 0x600000175900 [0x1058bbe40]>{signalled = No, valid = Yes, order = 0, context = <CFMachPort 0x60000015b5f0 [0x1058bbe40]>{valid = Yes, port = 2503, source = 0x600000175900, callout = _ZL26power_notify_port_callbackP12__CFMachPortPvlS1_ (0x10627fb06), context = <CFMachPort context 0x0>}}
5 : <CFRunLoopSource 0x608000176a40 [0x1058bbe40]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 27403, subsystem = 0x107e294f0, context = 0x60800003e280}}
6 : <CFRunLoopSource 0x600000175cc0 [0x1058bbe40]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 1, info = 0x3703, callout = PurpleEventCallback (0x10ae9cc58)}}
}
,
observers = (
"<CFRunLoopObserver 0x608000136800 [0x1058bbe40]>{valid = Yes, activities = 0x1, repeats = Yes, order = -2147483647, callout = _wrapRunLoopWithAutoreleasePoolHandler (0x106f83de6), context = <CFArray 0x60800005f410 [0x1058bbe40]>{type = mutable-small, count = 0, values = ()}}",
"<CFRunLoopObserver 0x600000136d00 [0x1058bbe40]>{valid = Yes, activities = 0x20, repeats = Yes, order = 0, callout = _UIGestureRecognizerUpdateObserver (0x1074adb1b), context = <CFRunLoopObserver context 0x6000000da470>}",
"<CFRunLoopObserver 0x608000136080 [0x1058bbe40]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 1999000, callout = _beforeCACommitHandler (0x106fb645c), context = <CFRunLoopObserver context 0x7fa063f00ac0>}",
"<CFRunLoopObserver 0x608000136300 [0x1058bbe40]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2000000, callout = _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv (0x106320ac4), context = <CFRunLoopObserver context 0x0>}",
"<CFRunLoopObserver 0x608000136260 [0x1058bbe40]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2001000, callout = _afterCACommitHandler (0x106fb64d7), context = <CFRunLoopObserver context 0x7fa063f00ac0>}",
"<CFRunLoopObserver 0x6080001368a0 [0x1058bbe40]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2147483647, callout = _wrapRunLoopWithAutoreleasePoolHandler (0x106f83de6), context = <CFArray 0x60800005f410 [0x1058bbe40]>{type = mutable-small, count = 0, values = ()}}"
),
timers = (null),
currently 525108406 (10580007687927) / soft deadline in: 1.84467335e+10 sec (@ -1) / hard deadline in: 1.84467335e+10 sec (@ -1)
},
3 : <CFRunLoopMode 0x608000193590 [0x1058bbe40]>{name = GSEventReceiveRunLoopMode, port set = 0x2f03, queue = 0x608000175540, source = 0x6080001d2570 (not fired), timer port = 0x3103,
sources0 = <CFBasicHash 0x60800005e9c0 [0x1058bbe40]>{type = mutable set, count = 1,
entries =>
0 : <CFRunLoopSource 0x608000175480 [0x1058bbe40]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x0, callout = PurpleEventSignalCallback (0x10ae9a723)}}
}
,
sources1 = <CFBasicHash 0x60800005e990 [0x1058bbe40]>{type = mutable set, count = 1,
entries =>
1 : <CFRunLoopSource 0x600000175d80 [0x1058bbe40]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 1, info = 0x3703, callout = PurpleEventCallback (0x10ae9cc58)}}
}
,
observers = (null),
timers = (null),
currently 525108406 (10580009074827) / soft deadline in: 1.84467335e+10 sec (@ -1) / hard deadline in: 1.84467335e+10 sec (@ -1)
},
4 : <CFRunLoopMode 0x6000001934c0 [0x1058bbe40]>{name = kCFRunLoopDefaultMode, port set = 0x2203, queue = 0x600000175840, source = 0x6000001d13a0 (not fired), timer port = 0x2403,
sources0 = <CFBasicHash 0x60000005d6d0 [0x1058bbe40]>{type = mutable set, count = 4,
entries =>
0 : <CFRunLoopSource 0x608000175480 [0x1058bbe40]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x0, callout = PurpleEventSignalCallback (0x10ae9a723)}}
3 : <CFRunLoopSource 0x608000176080 [0x1058bbe40]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x600000136bc0, callout = __handleEventQueue (0x1077840d0)}}
4 : <CFRunLoopSource 0x600000176500 [0x1058bbe40]>{signalled = Yes, valid = Yes, order = 0, context = <CFRunLoopSource context>{version = 0, info = 0x600000262700, callout = FBSSerialQueueRunLoopSourceHandler (0x10c526ca6)}}
5 : <CFRunLoopSource 0x608000175c00 [0x1058bbe40]>{signalled = Yes, valid = Yes, order = -2, context = <CFRunLoopSource context>{version = 0, info = 0x60000005eae0, callout = __handleHIDEventFetcherDrain (0x10778588c)}}
}
,
sources1 = <CFBasicHash 0x60000005d6a0 [0x1058bbe40]>{type = mutable set, count = 6,
entries =>
0 : <CFRunLoopSource 0x608000176e00 [0x1058bbe40]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 29187, subsystem = 0x10c90bf60, context = 0x6000000ba460}}
1 : <CFRunLoopSource 0x608000176140 [0x1058bbe40]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 23311, subsystem = 0x107e12b10, context = 0x0}}
3 : <CFRunLoopSource 0x600000175780 [0x1058bbe40]>{signalled = No, valid = Yes, order = 0, context = <CFMachPort 0x60000015b6a0 [0x1058bbe40]>{valid = Yes, port = 1c03, source = 0x600000175780, callout = _ZL27change_notify_port_callbackP12__CFMachPortPvlS1_ (0x10627f9f7), context = <CFMachPort context 0x0>}}
4 : <CFRunLoopSource 0x600000175900 [0x1058bbe40]>{signalled = No, valid = Yes, order = 0, context = <CFMachPort 0x60000015b5f0 [0x1058bbe40]>{valid = Yes, port = 2503, source = 0x600000175900, callout = _ZL26power_notify_port_callbackP12__CFMachPortPvlS1_ (0x10627fb06), context = <CFMachPort context 0x0>}}
5 : <CFRunLoopSource 0x608000176a40 [0x1058bbe40]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 27403, subsystem = 0x107e294f0, context = 0x60800003e280}}
6 : <CFRunLoopSource 0x600000175cc0 [0x1058bbe40]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 1, info = 0x3703, callout = PurpleEventCallback (0x10ae9cc58)}}
}
,
observers = (
"<CFRunLoopObserver 0x608000136800 [0x1058bbe40]>{valid = Yes, activities = 0x1, repeats = Yes, order = -2147483647, callout = _wrapRunLoopWithAutoreleasePoolHandler (0x106f83de6), context = <CFArray 0x60800005f410 [0x1058bbe40]>{type = mutable-small, count = 0, values = ()}}",
"<CFRunLoopObserver 0x600000136d00 [0x1058bbe40]>{valid = Yes, activities = 0x20, repeats = Yes, order = 0, callout = _UIGestureRecognizerUpdateObserver (0x1074adb1b), context = <CFRunLoopObserver context 0x6000000da470>}",
"<CFRunLoopObserver 0x608000136080 [0x1058bbe40]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 1999000, callout = _beforeCACommitHandler (0x106fb645c), context = <CFRunLoopObserver context 0x7fa063f00ac0>}",
"<CFRunLoopObserver 0x608000136300 [0x1058bbe40]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2000000, callout = _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv (0x106320ac4), context = <CFRunLoopObserver context 0x0>}",
"<CFRunLoopObserver 0x608000136260 [0x1058bbe40]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2001000, callout = _afterCACommitHandler (0x106fb64d7), context = <CFRunLoopObserver context 0x7fa063f00ac0>}",
"<CFRunLoopObserver 0x6080001368a0 [0x1058bbe40]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2147483647, callout = _wrapRunLoopWithAutoreleasePoolHandler (0x106f83de6), context = <CFArray 0x60800005f410 [0x1058bbe40]>{type = mutable-small, count = 0, values = ()}}"
),
timers = <CFArray 0x6000000ba6a0 [0x1058bbe40]>{type = mutable-small, count = 1, values = (
0 : <CFRunLoopTimer 0x600000175fc0 [0x1058bbe40]>{valid = Yes, firing = No, interval = 0, tolerance = 0, next fire date = 525108408 (1.41212302 @ 10581423929411), callout = (Delayed Perform) UIApplication _accessibilitySetUpQuickSpeak (0x1047d118f / 0x1073e6c55) (/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks/UIKit.framework/UIKit), context = <CFRunLoopTimer context 0x600000260500>}
)},
currently 525108406 (10580009118217) / soft deadline in: 1.41481117 sec (@ 10581423929411) / hard deadline in: 1.41481113 sec (@ 10581423929411)
},
5 : <CFRunLoopMode 0x600000193800 [0x1058bbe40]>{name = UIInitializationRunLoopMode, port set = 0x4523, queue = 0x6000001765c0, source = 0x6000001d1a30 (not fired), timer port = 0x4723,
sources0 = <CFBasicHash 0x60000005fef0 [0x1058bbe40]>{type = mutable set, count = 1,
entries =>
2 : <CFRunLoopSource 0x600000176500 [0x1058bbe40]>{signalled = Yes, valid = Yes, order = 0, context = <CFRunLoopSource context>{version = 0, info = 0x600000262700, callout = FBSSerialQueueRunLoopSourceHandler (0x10c526ca6)}}
}
,
sources1 = <CFBasicHash 0x60000005ff20 [0x1058bbe40]>{type = mutable set, count = 0,
entries =>
}
,
observers = (
"<CFRunLoopObserver 0x608000136300 [0x1058bbe40]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2000000, callout = _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv (0x106320ac4), context = <CFRunLoopObserver context 0x0>}"
),
timers = (null),
currently 525108406 (10580011879022) / soft deadline in: 1.84467335e+10 sec (@ -1) / hard deadline in: 1.84467335e+10 sec (@ -1)
},
6 : <CFRunLoopMode 0x6000001938d0 [0x1058bbe40]>{name = kCFRunLoopCommonModes, port set = 0x6007, queue = 0x600000176380, source = 0x6000001d1c10 (not fired), timer port = 0x6203,
sources0 = (null),
sources1 = (null),
observers = (null),
timers = (null),
currently 525108406 (10580012030882) / soft deadline in: 1.84467335e+10 sec (@ -1) / hard deadline in: 1.84467335e+10 sec (@ -1)
},
}
}
currentRunLoop2
2017-08-22 23:26:46.155 JJOC[3275:97472] currentRunLoop2 = <CFRunLoop 0x608000176440 [0x1058bbe40]>{wakeup port = 0x7303, stopped = false, ignoreWakeUps = true,
current mode = (none),
common modes = <CFBasicHash 0x60800005fb00 [0x1058bbe40]>{type = mutable set, count = 1,
entries =>
2 : <CFString 0x105893970 [0x1058bbe40]>{contents = "kCFRunLoopDefaultMode"}
}
,
common mode items = (null),
modes = <CFBasicHash 0x60800005fda0 [0x1058bbe40]>{type = mutable set, count = 1,
entries =>
2 : <CFRunLoopMode 0x6080001946a0 [0x1058bbe40]>{name = kCFRunLoopDefaultMode, port set = 0x7403, queue = 0x608000176f80, source = 0x6080001d2840 (not fired), timer port = 0x7603,
sources0 = (null),
sources1 = (null),
observers = (null),
timers = (null),
currently 525108406 (10580015258087) / soft deadline in: 1.84467335e+10 sec (@ -1) / hard deadline in: 1.84467335e+10 sec (@ -1)
},
}
}
結(jié)論:輸出的東西很多還很長门躯,具體什么意思后面會和大家說,這里大家只要知道currentRunLoop1 = <CFRunLoop 0x6000001756c0...
和currentRunLoop2 = <CFRunLoop 0x608000176440...
酷师。它們是兩個不同的對象讶凉。
二、@property(readonly, copy) NSRunLoopMode currentMode;
這里currentMode
的意思就是運(yùn)行循環(huán)的模式山孔,我們每一個RunLoop在運(yùn)行的時候都是在某一個模式或者模式的組合上運(yùn)行的懂讯。
這里NSRunLoopMode
模式是一個字符串,runloop的模式台颠,使得runloop顯得更加靈活域醇,適應(yīng)更多的應(yīng)用場景。如果定時器處于mode1蓉媳,而runloop運(yùn)行在mode2,則定時器不會觸發(fā)锅铅,只有runloop運(yùn)行在mode1時酪呻,定時器才會觸發(fā)。
系統(tǒng)為我們提供了多種模式,下面列一些比較常遇到的:
-
kCFRunLoopDefaultMode
: App的默認(rèn) Mode盐须,通常主線程是在這個 Mode 下運(yùn)行的玩荠。 -
UITrackingRunLoopMode
: 界面跟蹤 Mode,用于 ScrollView 追蹤觸摸滑動,保證界面滑動時不受其他 Mode 影響阶冈。 -
UIInitializationRunLoopMode
: 在剛啟動 App 時第進(jìn)入的第一個 Mode闷尿,啟動完成后就不再使用。 -
NSRunLoopCommonModes
: 包含了多種模式:default
,modal
, 和tracking modes
女坑。
這里只是簡單的說了下這幾個模式填具,后續(xù)會和大家詳述。
下面看一下代碼
- (void)demoCurrentMode
{
NSLog(@"currentRunLoop1 = %@", [NSRunLoop currentRunLoop].currentMode);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"currentRunLoop2 = %@", [NSRunLoop currentRunLoop].currentMode);
});
}
下面看輸出結(jié)果
2017-08-23 00:11:54.867 JJOC[4198:127223] currentRunLoop1 = UIInitializationRunLoopMode
2017-08-23 00:11:54.867 JJOC[4198:127355] currentRunLoop2 = (null)
這里還需要注意:
- 當(dāng)前輸入模式匆骗,該方法僅在接收器運(yùn)行時返回當(dāng)前輸入模式; 否則返回零劳景。
- 當(dāng)前模式由運(yùn)行循環(huán)的方法設(shè)置,如
acceptInputForMode:beforeDate:
和runMode:beforeDate :
碉就。
結(jié)論:這個模式還是需要好好的理解的盟广,很重要。
三瓮钥、- (NSDate *)limitDateForMode:(NSRunLoopMode)mode;
該方法的作用是:在指定的模式下執(zhí)行一次通過運(yùn)行循環(huán)筋量,并返回下一個定時器計劃啟動的日期。也可以這么理解為下一次的運(yùn)行時間碉熄,如果在指定的mode上沒有inputSource則輸出nil桨武。其實(shí)就是獲取下一個響應(yīng)時間。
定時器的執(zhí)行具被,其實(shí)并不是按照時間段額間隔進(jìn)行調(diào)用方法玻募,而是在定時器注冊到RunLoop中后,RunLoop會設(shè)置一個一個的時間點(diǎn)進(jìn)行調(diào)用一姿,例如七咧,5,10,15,20等等。如果錯過了某個時間點(diǎn)叮叹,定時器并不會延遲調(diào)用艾栋,而是直接等待下一個時間點(diǎn)調(diào)用,所以定時器并不是準(zhǔn)確的蛉顽。
下面我們看一下參數(shù)和返回值蝗砾。
-
mode
:運(yùn)行循環(huán)模式進(jìn)行搜索。 您可以指定自定義模式或使用運(yùn)行循環(huán)模式Run Loop Modes
中列出的其中一種模式携冤。 -
return
:下一個計時器的啟動日期悼粮,如果沒有此模式的輸入源,則為零曾棕。
這里還需要注意:
- 運(yùn)行循環(huán)以立即超時輸入扣猫,因此如果沒有輸入源需要處理,運(yùn)行循環(huán)不會阻塞翘地,等待輸入申尤。
結(jié)論:這個我也基本不會用到癌幕。
四、@property(class, readonly, strong) NSRunLoop *mainRunLoop;
這個屬性的作用就是獲取主線程的runloop對象昧穿,還是很好理解的勺远,下面我們看代碼。
- (void)demoMainRunLoop
{
NSLog(@"mainRunLoop === %@", [NSRunLoop mainRunLoop]);
}
大家看一下輸出結(jié)果
017-08-23 11:35:43.202149+0800 JJOC[10999:5290377] mainRunLoop === <CFRunLoop 0x17416c780 [0x1aa03fbb8]>{wakeup port = 0x2103, stopped = false, ignoreWakeUps = true,
current mode = UIInitializationRunLoopMode,
common modes = <CFBasicHash 0x1740460f0 [0x1aa03fbb8]>{type = mutable set, count = 2,
entries =>
0 : <CFString 0x1a48f4970 [0x1aa03fbb8]>{contents = "UITrackingRunLoopMode"}
2 : <CFString 0x1a3e3c4b0 [0x1aa03fbb8]>{contents = "kCFRunLoopDefaultMode"}
}
,
common mode items = <CFBasicHash 0x174046270 [0x1aa03fbb8]>{type = mutable set, count = 16,
entries =>
0 : <CFRunLoopSource 0x17016cf00 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x0, callout = <redacted> (0x1856cab5c)}}
1 : <CFRunLoopObserver 0x17013e8c0 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 1999000, callout = <redacted> (0x18a156150), context = <CFRunLoopObserver context 0x139d00dc0>}
2 : <CFRunLoopObserver 0x17013e820 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2001000, callout = <redacted> (0x189ea86a0), context = <CFRunLoopObserver context 0x139d00dc0>}
3 : <CFRunLoopObserver 0x17013e780 [0x1aa03fbb8]>{valid = Yes, activities = 0x1, repeats = Yes, order = -2147483647, callout = <redacted> (0x189ea8824), context = <CFArray 0x17005c1d0 [0x1aa03fbb8]>{type = mutable-small, count = 0, values = ()}}
4 : <CFRunLoopSource 0x17416ccc0 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 1, info = 0x3603, callout = <redacted> (0x1856cd370)}}
5 : <CFRunLoopSource 0x17016d800 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x17013ea00, callout = <redacted> (0x18a6a9614)}}
6 : <CFRunLoopObserver 0x17013e5a0 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2147483647, callout = <redacted> (0x189ea8824), context = <CFArray 0x17005c1d0 [0x1aa03fbb8]>{type = mutable-small, count = 0, values = ()}}
7 : <CFRunLoopSource 0x17416c840 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFMachPort 0x174146300 [0x1aa03fbb8]>{valid = Yes, port = 2003, source = 0x17416c840, callout = <redacted> (0x186f98ee0), context = <CFMachPort context 0x0>}}
8 : <CFRunLoopSource 0x17416d080 [0x1aa03fbb8]>{signalled = Yes, valid = Yes, order = 0, context = <CFRunLoopSource context>{version = 0, info = 0x17407b4c0, callout = <redacted> (0x18592ef34)}}
9 : <CFRunLoopSource 0x17016d680 [0x1aa03fbb8]>{signalled = Yes, valid = Yes, order = -2, context = <CFRunLoopSource context>{version = 0, info = 0x170047860, callout = <redacted> (0x18a6aaa58)}}
10 : <CFRunLoopObserver 0x17013e500 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2000000, callout = <redacted> (0x18703ae14), context = <CFRunLoopObserver context 0x0>}
11 : <CFRunLoopSource 0x17416e400 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 25351, subsystem = 0x1a48d1600, context = 0x17403cee0}}
12 : <CFRunLoopSource 0x17016e7c0 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 26887, subsystem = 0x1a415ff90, context = 0x1700ac240}}
15 : <CFRunLoopSource 0x17016d8c0 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 17955, subsystem = 0x1a48baba0, context = 0x0}}
19 : <CFRunLoopObserver 0x17013ebe0 [0x1aa03fbb8]>{valid = Yes, activities = 0x20, repeats = Yes, order = 0, callout = <redacted> (0x189ea8698), context = <CFRunLoopObserver context 0x1700d9280>}
22 : <CFRunLoopSource 0x17416c9c0 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFMachPort 0x1741463b0 [0x1aa03fbb8]>{valid = Yes, port = 2503, source = 0x17416c9c0, callout = <redacted> (0x186f98fec), context = <CFMachPort context 0x0>}}
}
,
modes = <CFBasicHash 0x1740461e0 [0x1aa03fbb8]>{type = mutable set, count = 5,
entries =>
2 : <CFRunLoopMode 0x174183dc0 [0x1aa03fbb8]>{name = UITrackingRunLoopMode, port set = 0x2703, queue = 0x17416ca80, source = 0x1741dd4c0 (not fired), timer port = 0x2903,
sources0 = <CFBasicHash 0x174046b10 [0x1aa03fbb8]>{type = mutable set, count = 4,
entries =>
0 : <CFRunLoopSource 0x17016cf00 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x0, callout = <redacted> (0x1856cab5c)}}
1 : <CFRunLoopSource 0x17016d680 [0x1aa03fbb8]>{signalled = Yes, valid = Yes, order = -2, context = <CFRunLoopSource context>{version = 0, info = 0x170047860, callout = <redacted> (0x18a6aaa58)}}
3 : <CFRunLoopSource 0x17416d080 [0x1aa03fbb8]>{signalled = Yes, valid = Yes, order = 0, context = <CFRunLoopSource context>{version = 0, info = 0x17407b4c0, callout = <redacted> (0x18592ef34)}}
5 : <CFRunLoopSource 0x17016d800 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x17013ea00, callout = <redacted> (0x18a6a9614)}}
}
,
sources1 = <CFBasicHash 0x174046ae0 [0x1aa03fbb8]>{type = mutable set, count = 6,
entries =>
0 : <CFRunLoopSource 0x17016d8c0 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 17955, subsystem = 0x1a48baba0, context = 0x0}}
1 : <CFRunLoopSource 0x17016e7c0 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 26887, subsystem = 0x1a415ff90, context = 0x1700ac240}}
2 : <CFRunLoopSource 0x17416ccc0 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 1, info = 0x3603, callout = <redacted> (0x1856cd370)}}
4 : <CFRunLoopSource 0x17416c9c0 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFMachPort 0x1741463b0 [0x1aa03fbb8]>{valid = Yes, port = 2503, source = 0x17416c9c0, callout = <redacted> (0x186f98fec), context = <CFMachPort context 0x0>}}
5 : <CFRunLoopSource 0x17416c840 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFMachPort 0x174146300 [0x1aa03fbb8]>{valid = Yes, port = 2003, source = 0x17416c840, callout = <redacted> (0x186f98ee0), context = <CFMachPort context 0x0>}}
6 : <CFRunLoopSource 0x17416e400 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 25351, subsystem = 0x1a48d1600, context = 0x17403cee0}}
}
,
observers = (
"<CFRunLoopObserver 0x17013e780 [0x1aa03fbb8]>{valid = Yes, activities = 0x1, repeats = Yes, order = -2147483647, callout = <redacted> (0x189ea8824), context = <CFArray 0x17005c1d0 [0x1aa03fbb8]>{type = mutable-small, count = 0, values = ()}}",
"<CFRunLoopObserver 0x17013ebe0 [0x1aa03fbb8]>{valid = Yes, activities = 0x20, repeats = Yes, order = 0, callout = <redacted> (0x189ea8698), context = <CFRunLoopObserver context 0x1700d9280>}",
"<CFRunLoopObserver 0x17013e8c0 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 1999000, callout = <redacted> (0x18a156150), context = <CFRunLoopObserver context 0x139d00dc0>}",
"<CFRunLoopObserver 0x17013e500 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2000000, callout = <redacted> (0x18703ae14), context = <CFRunLoopObserver context 0x0>}",
"<CFRunLoopObserver 0x17013e820 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2001000, callout = <redacted> (0x189ea86a0), context = <CFRunLoopObserver context 0x139d00dc0>}",
"<CFRunLoopObserver 0x17013e5a0 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2147483647, callout = <redacted> (0x189ea8824), context = <CFArray 0x17005c1d0 [0x1aa03fbb8]>{type = mutable-small, count = 0, values = ()}}"
),
timers = (null),
currently 525152143 (35300544762839) / soft deadline in: 7.68612866e+11 sec (@ -1) / hard deadline in: 7.68612866e+11 sec (@ -1)
},
3 : <CFRunLoopMode 0x170183c20 [0x1aa03fbb8]>{name = GSEventReceiveRunLoopMode, port set = 0x2e0b, queue = 0x17016cfc0, source = 0x1701dce30 (not fired), timer port = 0x3003,
sources0 = <CFBasicHash 0x1700476e0 [0x1aa03fbb8]>{type = mutable set, count = 1,
entries =>
0 : <CFRunLoopSource 0x17016cf00 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x0, callout = <redacted> (0x1856cab5c)}}
}
,
sources1 = <CFBasicHash 0x1700476b0 [0x1aa03fbb8]>{type = mutable set, count = 1,
entries =>
0 : <CFRunLoopSource 0x17416cd80 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 1, info = 0x3603, callout = <redacted> (0x1856cd370)}}
}
,
observers = (null),
timers = (null),
currently 525152143 (35300544795114) / soft deadline in: 7.68612866e+11 sec (@ -1) / hard deadline in: 7.68612866e+11 sec (@ -1)
},
4 : <CFRunLoopMode 0x174183cf0 [0x1aa03fbb8]>{name = kCFRunLoopDefaultMode, port set = 0x2203, queue = 0x17416c900, source = 0x1741dd1f0 (not fired), timer port = 0x2403,
sources0 = <CFBasicHash 0x174045d90 [0x1aa03fbb8]>{type = mutable set, count = 4,
entries =>
0 : <CFRunLoopSource 0x17016cf00 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x0, callout = <redacted> (0x1856cab5c)}}
1 : <CFRunLoopSource 0x17016d680 [0x1aa03fbb8]>{signalled = Yes, valid = Yes, order = -2, context = <CFRunLoopSource context>{version = 0, info = 0x170047860, callout = <redacted> (0x18a6aaa58)}}
3 : <CFRunLoopSource 0x17416d080 [0x1aa03fbb8]>{signalled = Yes, valid = Yes, order = 0, context = <CFRunLoopSource context>{version = 0, info = 0x17407b4c0, callout = <redacted> (0x18592ef34)}}
5 : <CFRunLoopSource 0x17016d800 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x17013ea00, callout = <redacted> (0x18a6a9614)}}
}
,
sources1 = <CFBasicHash 0x1740460c0 [0x1aa03fbb8]>{type = mutable set, count = 6,
entries =>
0 : <CFRunLoopSource 0x17016d8c0 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 17955, subsystem = 0x1a48baba0, context = 0x0}}
1 : <CFRunLoopSource 0x17016e7c0 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 26887, subsystem = 0x1a415ff90, context = 0x1700ac240}}
2 : <CFRunLoopSource 0x17416ccc0 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 1, info = 0x3603, callout = <redacted> (0x1856cd370)}}
4 : <CFRunLoopSource 0x17416c9c0 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFMachPort 0x1741463b0 [0x1aa03fbb8]>{valid = Yes, port = 2503, source = 0x17416c9c0, callout = <redacted> (0x186f98fec), context = <CFMachPort context 0x0>}}
5 : <CFRunLoopSource 0x17416c840 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFMachPort 0x174146300 [0x1aa03fbb8]>{valid = Yes, port = 2003, source = 0x17416c840, callout = <redacted> (0x186f98ee0), context = <CFMachPort context 0x0>}}
6 : <CFRunLoopSource 0x17416e400 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 25351, subsystem = 0x1a48d1600, context = 0x17403cee0}}
}
,
observers = (
"<CFRunLoopObserver 0x17013e780 [0x1aa03fbb8]>{valid = Yes, activities = 0x1, repeats = Yes, order = -2147483647, callout = <redacted> (0x189ea8824), context = <CFArray 0x17005c1d0 [0x1aa03fbb8]>{type = mutable-small, count = 0, values = ()}}",
"<CFRunLoopObserver 0x17013ebe0 [0x1aa03fbb8]>{valid = Yes, activities = 0x20, repeats = Yes, order = 0, callout = <redacted> (0x189ea8698), context = <CFRunLoopObserver context 0x1700d9280>}",
"<CFRunLoopObserver 0x17013e8c0 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 1999000, callout = <redacted> (0x18a156150), context = <CFRunLoopObserver context 0x139d00dc0>}",
"<CFRunLoopObserver 0x17013e500 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2000000, callout = <redacted> (0x18703ae14), context = <CFRunLoopObserver context 0x0>}",
"<CFRunLoopObserver 0x17013e820 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2001000, callout = <redacted> (0x189ea86a0), context = <CFRunLoopObserver context 0x139d00dc0>}",
"<CFRunLoopObserver 0x17013e5a0 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2147483647, callout = <redacted> (0x189ea8824), context = <CFArray 0x17005c1d0 [0x1aa03fbb8]>{type = mutable-small, count = 0, values = ()}}"
),
timers = <CFArray 0x1740abe20 [0x1aa03fbb8]>{type = mutable-small, count = 1, values = (
0 : <CFRunLoopTimer 0x17416d800 [0x1aa03fbb8]>{valid = Yes, firing = No, interval = 0, tolerance = 0, next fire date = 525152145 (1.37681502 @ 35300577893733), callout = (Delayed Perform) UIApplication _accessibilitySetUpQuickSpeak (0x184863a64 / 0x189f3ac2c) (/System/Library/Frameworks/UIKit.framework/UIKit), context = <CFRunLoopTimer context 0x17407ad80>}
)},
currently 525152143 (35300544796303) / soft deadline in: 1.37905954 sec (@ 35300577893733) / hard deadline in: 1.3790595 sec (@ 35300577893733)
},
5 : <CFRunLoopMode 0x174183f60 [0x1aa03fbb8]>{name = UIInitializationRunLoopMode, port set = 0x3d03, queue = 0x17416d140, source = 0x1741dd790 (not fired), timer port = 0x3f03,
sources0 = <CFBasicHash 0x174047650 [0x1aa03fbb8]>{type = mutable set, count = 1,
entries =>
1 : <CFRunLoopSource 0x17416d080 [0x1aa03fbb8]>{signalled = Yes, valid = Yes, order = 0, context = <CFRunLoopSource context>{version = 0, info = 0x17407b4c0, callout = <redacted> (0x18592ef34)}}
}
,
sources1 = <CFBasicHash 0x174047680 [0x1aa03fbb8]>{type = mutable set, count = 0,
entries =>
}
,
observers = (
"<CFRunLoopObserver 0x17013e500 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2000000, callout = <redacted> (0x18703ae14), context = <CFRunLoopObserver context 0x0>}"
),
timers = (null),
currently 525152143 (35300544850972) / soft deadline in: 7.68612866e+11 sec (@ -1) / hard deadline in: 7.68612866e+11 sec (@ -1)
},
6 : <CFRunLoopMode 0x174184920 [0x1aa03fbb8]>{name = kCFRunLoopCommonModes, port set = 0x560f, queue = 0x17416dec0, source = 0x1741dda60 (not fired), timer port = 0x5903,
sources0 = (null),
sources1 = (null),
observers = (null),
timers = (null),
currently 525152143 (35300544853174) / soft deadline in: 7.68612866e+11 sec (@ -1) / hard deadline in: 7.68612866e+11 sec (@ -1)
},
}
}
結(jié)論:簡單易用,但是可以不用深究。
五牲览、- (CFRunLoopRef)getCFRunLoop;
該方法的作用就是返回底層的CFRunLoop
對象。
這里還要注意:你可以使用返回的runloop來通過使用Core Foundation函數(shù)調(diào)用配置當(dāng)前的運(yùn)行循環(huán)宪塔。例如,您可以使用此功能設(shè)置運(yùn)行循環(huán)觀察器囊拜。
下面我們看代碼某筐。
- (void)demoGetCFRunLoop
{
CFRunLoopRef *loopRef1 = [[NSRunLoop currentRunLoop] getCFRunLoop];
NSLog(@"loopRef1 = %@", loopRef1);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
CFRunLoopRef *loopRef2 = [[NSRunLoop currentRunLoop] getCFRunLoop];
NSLog(@"loopRef2 = %@", loopRef2);
});
}
下面看輸出結(jié)果
loopRef1
2017-08-23 11:48:32.070252+0800 JJOC[11006:5293944] loopRef1 = <CFRunLoop 0x170166b40 [0x1aa03fbb8]>{wakeup port = 0x2203, stopped = false, ignoreWakeUps = true,
current mode = UIInitializationRunLoopMode,
common modes = <CFBasicHash 0x17004ae30 [0x1aa03fbb8]>{type = mutable set, count = 2,
entries =>
0 : <CFString 0x1a48f4970 [0x1aa03fbb8]>{contents = "UITrackingRunLoopMode"}
2 : <CFString 0x1a3e3c4b0 [0x1aa03fbb8]>{contents = "kCFRunLoopDefaultMode"}
}
,
common mode items = <CFBasicHash 0x17004ab00 [0x1aa03fbb8]>{type = mutable set, count = 16,
entries =>
0 : <CFRunLoopSource 0x170167080 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x0, callout = <redacted> (0x1856cab5c)}}
1 : <CFRunLoopSource 0x1701684c0 [0x1aa03fbb8]>{signalled = Yes, valid = Yes, order = -2, context = <CFRunLoopSource context>{version = 0, info = 0x17004c0c0, callout = <redacted> (0x18a6aaa58)}}
2 : <CFRunLoopSource 0x170166d80 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFMachPort 0x170158f70 [0x1aa03fbb8]>{valid = Yes, port = 2603, source = 0x170166d80, callout = <redacted> (0x186f98fec), context = <CFMachPort context 0x0>}}
3 : <CFRunLoopSource 0x1741669c0 [0x1aa03fbb8]>{signalled = Yes, valid = Yes, order = 0, context = <CFRunLoopSource context>{version = 0, info = 0x17406c800, callout = <redacted> (0x18592ef34)}}
4 : <CFRunLoopSource 0x1701675c0 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 1, info = 0x3603, callout = <redacted> (0x1856cd370)}}
5 : <CFRunLoopObserver 0x170137520 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2147483647, callout = <redacted> (0x189ea8824), context = <CFArray 0x1702405d0 [0x1aa03fbb8]>{type = mutable-small, count = 0, values = ()}}
6 : <CFRunLoopObserver 0x1701373e0 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2000000, callout = <redacted> (0x18703ae14), context = <CFRunLoopObserver context 0x0>}
7 : <CFRunLoopSource 0x1741678c0 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 25351, subsystem = 0x1a48d1600, context = 0x17002ad80}}
10 : <CFRunLoopSource 0x170166c00 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFMachPort 0x170158ec0 [0x1aa03fbb8]>{valid = Yes, port = 2103, source = 0x170166c00, callout = <redacted> (0x186f98ee0), context = <CFMachPort context 0x0>}}
15 : <CFRunLoopSource 0x170168280 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 17955, subsystem = 0x1a48baba0, context = 0x0}}
17 : <CFRunLoopSource 0x170168340 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x170137a20, callout = <redacted> (0x18a6a9614)}}
18 : <CFRunLoopObserver 0x170137980 [0x1aa03fbb8]>{valid = Yes, activities = 0x20, repeats = Yes, order = 0, callout = <redacted> (0x189ea8698), context = <CFRunLoopObserver context 0x1700cdeb0>}
19 : <CFRunLoopSource 0x174168100 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 26883, subsystem = 0x1a415ff90, context = 0x1700b4a00}}
20 : <CFRunLoopObserver 0x170137840 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 1999000, callout = <redacted> (0x18a156150), context = <CFRunLoopObserver context 0x100602130>}
21 : <CFRunLoopObserver 0x1701377a0 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2001000, callout = <redacted> (0x189ea86a0), context = <CFRunLoopObserver context 0x100602130>}
22 : <CFRunLoopObserver 0x170137700 [0x1aa03fbb8]>{valid = Yes, activities = 0x1, repeats = Yes, order = -2147483647, callout = <redacted> (0x189ea8824), context = <CFArray 0x1702405d0 [0x1aa03fbb8]>{type = mutable-small, count = 0, values = ()}}
}
,
modes = <CFBasicHash 0x17004ad40 [0x1aa03fbb8]>{type = mutable set, count = 5,
entries =>
2 : <CFRunLoopMode 0x174181110 [0x1aa03fbb8]>{name = UITrackingRunLoopMode, port set = 0x2903, queue = 0x174166900, source = 0x1741d2840 (not fired), timer port = 0x2b03,
sources0 = <CFBasicHash 0x17404b1c0 [0x1aa03fbb8]>{type = mutable set, count = 4,
entries =>
0 : <CFRunLoopSource 0x170167080 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x0, callout = <redacted> (0x1856cab5c)}}
1 : <CFRunLoopSource 0x1741669c0 [0x1aa03fbb8]>{signalled = Yes, valid = Yes, order = 0, context = <CFRunLoopSource context>{version = 0, info = 0x17406c800, callout = <redacted> (0x18592ef34)}}
2 : <CFRunLoopSource 0x170168340 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x170137a20, callout = <redacted> (0x18a6a9614)}}
6 : <CFRunLoopSource 0x1701684c0 [0x1aa03fbb8]>{signalled = Yes, valid = Yes, order = -2, context = <CFRunLoopSource context>{version = 0, info = 0x17004c0c0, callout = <redacted> (0x18a6aaa58)}}
}
,
sources1 = <CFBasicHash 0x17404b190 [0x1aa03fbb8]>{type = mutable set, count = 6,
entries =>
0 : <CFRunLoopSource 0x170168280 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 17955, subsystem = 0x1a48baba0, context = 0x0}}
1 : <CFRunLoopSource 0x170166d80 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFMachPort 0x170158f70 [0x1aa03fbb8]>{valid = Yes, port = 2603, source = 0x170166d80, callout = <redacted> (0x186f98fec), context = <CFMachPort context 0x0>}}
2 : <CFRunLoopSource 0x170166c00 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFMachPort 0x170158ec0 [0x1aa03fbb8]>{valid = Yes, port = 2103, source = 0x170166c00, callout = <redacted> (0x186f98ee0), context = <CFMachPort context 0x0>}}
3 : <CFRunLoopSource 0x1701675c0 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 1, info = 0x3603, callout = <redacted> (0x1856cd370)}}
4 : <CFRunLoopSource 0x1741678c0 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 25351, subsystem = 0x1a48d1600, context = 0x17002ad80}}
5 : <CFRunLoopSource 0x174168100 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 26883, subsystem = 0x1a415ff90, context = 0x1700b4a00}}
}
,
observers = (
"<CFRunLoopObserver 0x170137700 [0x1aa03fbb8]>{valid = Yes, activities = 0x1, repeats = Yes, order = -2147483647, callout = <redacted> (0x189ea8824), context = <CFArray 0x1702405d0 [0x1aa03fbb8]>{type = mutable-small, count = 0, values = ()}}",
"<CFRunLoopObserver 0x170137980 [0x1aa03fbb8]>{valid = Yes, activities = 0x20, repeats = Yes, order = 0, callout = <redacted> (0x189ea8698), context = <CFRunLoopObserver context 0x1700cdeb0>}",
"<CFRunLoopObserver 0x170137840 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 1999000, callout = <redacted> (0x18a156150), context = <CFRunLoopObserver context 0x100602130>}",
"<CFRunLoopObserver 0x1701373e0 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2000000, callout = <redacted> (0x18703ae14), context = <CFRunLoopObserver context 0x0>}",
"<CFRunLoopObserver 0x1701377a0 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2001000, callout = <redacted> (0x189ea86a0), context = <CFRunLoopObserver context 0x100602130>}",
"<CFRunLoopObserver 0x170137520 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2147483647, callout = <redacted> (0x189ea8824), context = <CFArray 0x1702405d0 [0x1aa03fbb8]>{type = mutable-small, count = 0, values = ()}}"
),
timers = (null),
currently 525152912 (35318997621563) / soft deadline in: 7.68612865e+11 sec (@ -1) / hard deadline in: 7.68612865e+11 sec (@ -1)
},
3 : <CFRunLoopMode 0x170181040 [0x1aa03fbb8]>{name = GSEventReceiveRunLoopMode, port set = 0x2e0b, queue = 0x170167140, source = 0x1701d2c00 (not fired), timer port = 0x3003,
sources0 = <CFBasicHash 0x17004bfa0 [0x1aa03fbb8]>{type = mutable set, count = 1,
entries =>
0 : <CFRunLoopSource 0x170167080 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x0, callout = <redacted> (0x1856cab5c)}}
}
,
sources1 = <CFBasicHash 0x17004beb0 [0x1aa03fbb8]>{type = mutable set, count = 1,
entries =>
0 : <CFRunLoopSource 0x170167500 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 1, info = 0x3603, callout = <redacted> (0x1856cd370)}}
}
,
observers = (null),
timers = (null),
currently 525152912 (35318997655243) / soft deadline in: 7.68612865e+11 sec (@ -1) / hard deadline in: 7.68612865e+11 sec (@ -1)
},
4 : <CFRunLoopMode 0x170180f70 [0x1aa03fbb8]>{name = kCFRunLoopDefaultMode, port set = 0x2303, queue = 0x170166cc0, source = 0x1701d2930 (not fired), timer port = 0x2503,
sources0 = <CFBasicHash 0x17004b190 [0x1aa03fbb8]>{type = mutable set, count = 4,
entries =>
0 : <CFRunLoopSource 0x170167080 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x0, callout = <redacted> (0x1856cab5c)}}
1 : <CFRunLoopSource 0x1741669c0 [0x1aa03fbb8]>{signalled = Yes, valid = Yes, order = 0, context = <CFRunLoopSource context>{version = 0, info = 0x17406c800, callout = <redacted> (0x18592ef34)}}
2 : <CFRunLoopSource 0x170168340 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 0, info = 0x170137a20, callout = <redacted> (0x18a6a9614)}}
6 : <CFRunLoopSource 0x1701684c0 [0x1aa03fbb8]>{signalled = Yes, valid = Yes, order = -2, context = <CFRunLoopSource context>{version = 0, info = 0x17004c0c0, callout = <redacted> (0x18a6aaa58)}}
}
,
sources1 = <CFBasicHash 0x17004ace0 [0x1aa03fbb8]>{type = mutable set, count = 6,
entries =>
0 : <CFRunLoopSource 0x170168280 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 17955, subsystem = 0x1a48baba0, context = 0x0}}
1 : <CFRunLoopSource 0x170166d80 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFMachPort 0x170158f70 [0x1aa03fbb8]>{valid = Yes, port = 2603, source = 0x170166d80, callout = <redacted> (0x186f98fec), context = <CFMachPort context 0x0>}}
2 : <CFRunLoopSource 0x170166c00 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFMachPort 0x170158ec0 [0x1aa03fbb8]>{valid = Yes, port = 2103, source = 0x170166c00, callout = <redacted> (0x186f98ee0), context = <CFMachPort context 0x0>}}
3 : <CFRunLoopSource 0x1701675c0 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = -1, context = <CFRunLoopSource context>{version = 1, info = 0x3603, callout = <redacted> (0x1856cd370)}}
4 : <CFRunLoopSource 0x1741678c0 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 25351, subsystem = 0x1a48d1600, context = 0x17002ad80}}
5 : <CFRunLoopSource 0x174168100 [0x1aa03fbb8]>{signalled = No, valid = Yes, order = 0, context = <CFRunLoopSource MIG Server> {port = 26883, subsystem = 0x1a415ff90, context = 0x1700b4a00}}
}
,
observers = (
"<CFRunLoopObserver 0x170137700 [0x1aa03fbb8]>{valid = Yes, activities = 0x1, repeats = Yes, order = -2147483647, callout = <redacted> (0x189ea8824), context = <CFArray 0x1702405d0 [0x1aa03fbb8]>{type = mutable-small, count = 0, values = ()}}",
"<CFRunLoopObserver 0x170137980 [0x1aa03fbb8]>{valid = Yes, activities = 0x20, repeats = Yes, order = 0, callout = <redacted> (0x189ea8698), context = <CFRunLoopObserver context 0x1700cdeb0>}",
"<CFRunLoopObserver 0x170137840 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 1999000, callout = <redacted> (0x18a156150), context = <CFRunLoopObserver context 0x100602130>}",
"<CFRunLoopObserver 0x1701373e0 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2000000, callout = <redacted> (0x18703ae14), context = <CFRunLoopObserver context 0x0>}",
"<CFRunLoopObserver 0x1701377a0 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2001000, callout = <redacted> (0x189ea86a0), context = <CFRunLoopObserver context 0x100602130>}",
"<CFRunLoopObserver 0x170137520 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2147483647, callout = <redacted> (0x189ea8824), context = <CFArray 0x1702405d0 [0x1aa03fbb8]>{type = mutable-small, count = 0, values = ()}}"
),
timers = <CFArray 0x1740b4760 [0x1aa03fbb8]>{type = mutable-small, count = 1, values = (
0 : <CFRunLoopTimer 0x174167440 [0x1aa03fbb8]>{valid = Yes, firing = No, interval = 0, tolerance = 0, next fire date = 525152913 (1.37859005 @ 35319030797578), callout = (Delayed Perform) UIApplication _accessibilitySetUpQuickSpeak (0x184863a64 / 0x189f3ac2c) (/System/Library/Frameworks/UIKit.framework/UIKit), context = <CFRunLoopTimer context 0x17406cbc0>}
)},
currently 525152912 (35318997656551) / soft deadline in: 1.38087608 sec (@ 35319030797578) / hard deadline in: 1.38087604 sec (@ 35319030797578)
},
5 : <CFRunLoopMode 0x174181380 [0x1aa03fbb8]>{name = UIInitializationRunLoopMode, port set = 0x3c03, queue = 0x174166d80, source = 0x1741d2b10 (not fired), timer port = 0x3e03,
sources0 = <CFBasicHash 0x17404ba00 [0x1aa03fbb8]>{type = mutable set, count = 1,
entries =>
2 : <CFRunLoopSource 0x1741669c0 [0x1aa03fbb8]>{signalled = Yes, valid = Yes, order = 0, context = <CFRunLoopSource context>{version = 0, info = 0x17406c800, callout = <redacted> (0x18592ef34)}}
}
,
sources1 = <CFBasicHash 0x17404ba30 [0x1aa03fbb8]>{type = mutable set, count = 0,
entries =>
}
,
observers = (
"<CFRunLoopObserver 0x1701373e0 [0x1aa03fbb8]>{valid = Yes, activities = 0xa0, repeats = Yes, order = 2000000, callout = <redacted> (0x18703ae14), context = <CFRunLoopObserver context 0x0>}"
),
timers = (null),
currently 525152912 (35318997712510) / soft deadline in: 7.68612865e+11 sec (@ -1) / hard deadline in: 7.68612865e+11 sec (@ -1)
},
6 : <CFRunLoopMode 0x1701827d0 [0x1aa03fbb8]>{name = kCFRunLoopCommonModes, port set = 0x5807, queue = 0x170168640, source = 0x1701d31a0 (not fired), timer port = 0x5903,
sources0 = (null),
sources1 = (null),
observers = (null),
timers = (null),
currently 525152912 (35318997714832) / soft deadline in: 7.68612865e+11 sec (@ -1) / hard deadline in: 7.68612865e+11 sec (@ -1)
},
}
}
loopRef2
2017-08-23 11:48:32.078486+0800 JJOC[11006:5293985] loopRef2 = <CFRunLoop 0x174167200 [0x1aa03fbb8]>{wakeup port = 0x4d0f, stopped = false, ignoreWakeUps = true,
current mode = (none),
common modes = <CFBasicHash 0x17404bee0 [0x1aa03fbb8]>{type = mutable set, count = 1,
entries =>
2 : <CFString 0x1a3e3c4b0 [0x1aa03fbb8]>{contents = "kCFRunLoopDefaultMode"}
}
,
common mode items = (null),
modes = <CFBasicHash 0x17404bc70 [0x1aa03fbb8]>{type = mutable set, count = 1,
entries =>
2 : <CFRunLoopMode 0x1741815f0 [0x1aa03fbb8]>{name = kCFRunLoopDefaultMode, port set = 0x560f, queue = 0x174167500, source = 0x1741d3650 (not fired), timer port = 0x520b,
sources0 = (null),
sources1 = (null),
observers = (null),
timers = (null),
currently 525152912 (35318997914397) / soft deadline in: 7.68612865e+11 sec (@ -1) / hard deadline in: 7.68612865e+11 sec (@ -1)
},
}
}
結(jié)論:如果沒有特殊的需求,一般也用不到這個底層冠跷,但是研究下還是好的南誊。
參考文章
1. NSRunloop一點(diǎn)理解
2. iOS開發(fā)RunLoop學(xué)習(xí):一:RunLoop簡單介紹
后記
未完,待續(xù)~~~