Safe Area
@johnlinvc
ॄኄੋ㠡㠡తʁ
• ䷩㘸㠡㠡తɻ
• ᙘ໘ෆ࿈᠃ɻ
• ༌ೖ౸ࢹ᧷ճᰶత࣌ؒࠩଠɻ
Slide 19
Slide 19 text
Safe Area
@johnlinvc
ᙘ໘త࿈᠃ੑ
• ਅመੈքతᱪతҠಈੋ࿈᠃తɻ
• ࡏᰖࣔᱪҠಈ࣌ɼՌਓ؟ೳⴺᚙݱ
தؒ༗ඃաతᙘ໘ɻब။᧷ಘ㠡㠡తɻ
Slide 20
Slide 20 text
Safe Area
@johnlinvc
ਓ؟తහ㕔
• 1991 తݚڀɻࢹਆៃࡉ๔ሣᦊນરᗜతጯɻ
• ༻ిۃఁଌਓᱪࢹਆៃሣ CRT ᦊນરᗜతጯɻ
• Human electroretinogram responses to video displays,
fluorescent lighting, and other high frequency sources
Slide 21
Slide 21 text
Safe Area
@johnlinvc
ਓ؟ՄҎ౸ 76 Hz తરᗜ
Slide 22
Slide 22 text
Safe Area
@johnlinvc
༌ೖ౸ࢹ᧷ճᰶత࣌ؒࠩ
• ਅመੈքతᱪडྗޙ။ཱࠁҠಈɼ
ᔒ༗Կ࣌ؒࠩɻ
• ༻ऀૢ࡞ޙաྃଠٱ࠽㗞ੜࢹ᧷ճᰶతɼ
ब။᧷ಘ㠡㠡తɻ
Slide 23
Slide 23 text
Safe Area
@johnlinvc
ճᰶཁଟշ࠽ⴺշ
• 2015 తݚڀɼ
ଌࢼ༻ऀሣᨀ߇༌ೖతࢹ᧷ճᰶԆᬌ
త༰ɻ
• How Much Faster is Fast Enough?
User Perception of Latency &
Latency Improvements in
Direct and Indirect Touch
Slide 24
Slide 24 text
Safe Area
@johnlinvc
ճᰶཁଟշ࠽ⴺշ
• ሣԙᴍ㐝䇪፮༗ෆಉత༰ɻ
• ᴍ㐝 69 ms
• 䇪፮ 11 ms
Slide 25
Slide 25 text
Safe Area
@johnlinvc
ҝॄኄ။㠡㠡తʁ
Slide 26
Slide 26 text
Safe Area
@johnlinvc
> զ၇ိҰݸ؆ᄸతɿզ၇ॴሜաతఔࣜɼେଟੋኺ಄౸ඌɺ
ҰߦҰߦԟԼࣥߦɼࣥߦඟɼఔࣜब݁ଋʀಹኄɼҰݸ GUI ጯ༻ఔࣜ
—ແੋզ၇ݱࡏਖ਼ࡏላशత iOS ᢛ Mac OS Xɺؐੋଖଞฏ—ҝॄኄ
ෆੋଧ։೭ޙҰ࿏ࣥߦ౸ఈ݁ଋɼࣕੋ။ఀཹࡏᦊນதզ၇ૢ࡞ʁ
KKBOX iOS/Mac OS X جૅ։ᚙڭࡐ
Slide 27
Slide 27 text
Safe Area
@johnlinvc
Run loop
Slide 28
Slide 28 text
Safe Area
@johnlinvc
Ұݸ loop ཫ໘ཁ၏తࣄ
ߋ৽ᙘ໘
Auto Release
ᨀᚙ Timer
Ꮕࣄ݅
႔ཧࣄ݅
Safe Area
@johnlinvc
Ұݸ loop Ֆྃଠଟ࣌ؒ
• ႔ཧಈա 11 ms => ಈ㠡㠡త
• ႔ཧᴍ㐝ա 69 ms => ᴍ㐝㠡㠡త
Slide 31
Slide 31 text
Safe Area
@johnlinvc
ղܾํ๏
• ॏෳར༻ view/cell/asset ɻ
• ར༻ଟ֩৺႔ཧثɻ
Slide 32
Slide 32 text
Safe Area
@johnlinvc
ղܾํ๏
• ॏෳར༻ view/cell/asset ɻ
• ར༻ଟ֩৺႔ཧثɻ
Slide 33
Slide 33 text
Safe Area
@johnlinvc
ॏෳ༻ View/Cell
• UICollectionView
dequeueReusableCell(withReuseIdentifier:for:)
• UIImage
Cached: init(named:)
Not Cached: init(contentsOfFile:)
• MKMapView
dequeueReusableAnnotationView(withIdentifier:)
Slide 34
Slide 34 text
Safe Area
@johnlinvc
Reusable
• https://github.com/AliSoftware/Reusable
• ՄҎ༻ Type Safe తํ๏ိఆٛ Reuse identifier.
final class CustomCell: UITableViewCell, Reusable
tableView.register(cellType: theCellClass.self)
let cell = tableView.dequeueReusableCell(for: indexPath) as
MyCustomCell
Slide 35
Slide 35 text
Safe Area
@johnlinvc
ղܾํ๏
• ॏෳར༻ view/cell/asset ɻ
• ར༻ଟ֩৺႔ཧثɻ
Slide 36
Slide 36 text
Safe Area
@johnlinvc
ଟ֩৺႔ཧث
• iPhone 12 ্༗ 6 ݸ CPU ֩৺ɻ
• ՄҎಉ࣌ࣥߦଟݸࣥߦॹɻ
• ཁࣄࢄ౸֤ݸ֩৺ɼबՄҎॖ run loop ႔ཧ࣌ؒɻ
Slide 37
Slide 37 text
Safe Area
@johnlinvc
ࡏผత thread ၏ࣄతํ๏
• Dispatch
• Combine
Slide 38
Slide 38 text
Safe Area
@johnlinvc
ࡏผత thread ၏ࣄతํ๏
• Dispatch
• Combine
Slide 39
Slide 39 text
Safe Area
@johnlinvc
Dispatch
• ༻ Obj-C block & Swift closure ိ෧ Thread APIɻ
• جຊ্बੋ code 㟚౸ queue ཫɼሏब။㢨㟬ࣥߦɻ
Slide 40
Slide 40 text
Safe Area
@johnlinvc
Dispatch
• ༻ DispatchQueue.async बՄҎᩋ code ࡏผత Thread 䋯ɻ
DispatchQueue.global(qos: .background).async {
// code to run
}
Slide 41
Slide 41 text
Safe Area
@johnlinvc
Refactoring legacy and concurrent thread API
with Testing
Slide 42
Slide 42 text
Safe Area
@johnlinvc
ࡏผత thread ၏ࣄతํ๏
• Dispatch
• Combine
Safe Area
@johnlinvc
UIKit ೳࡏ main Thread ݺڣ
• UIKit ᔒ༗ Thread Safetyɻ
• ࡏผతํݺڣత။༗ Error ɻ
• UI API called on a background thread: -[UIView initWithFrame:]
Slide 47
Slide 47 text
Safe Area
@johnlinvc
ආ໔ UIKit thread
• ࡏ Dispatch ཫ༻ DispatchQueue.main ճ Main Thread
• ࡏ Combine ཫ༻ receive(on:) ճ Main Thread
• ༻ SwiftUI
Slide 48
Slide 48 text
Safe Area
@johnlinvc
ආ໔ UIKit thread
• ࡏ Dispatch ཫ༻ DispatchQueue.main ճ Main Thread
• ࡏ Combine ཫ༻ receive(on:) ճ Main Thread
• ༻ SwiftUI
Slide 49
Slide 49 text
Safe Area
@johnlinvc
Swift UI
• એࠂࣜత UI Frameworkɻ
• ލฏɻ
• Auto Layoutɻ
Slide 50
Slide 50 text
Safe Area
@johnlinvc
༻ Swift UI
struct ContentView: View {
@State var clickCount : Int = 0
var body: some View {
Button(action: add) {
Text("\(clickCount)")
.font(.system(size: 120))
}
}
func add() {
clickCount += 1
}
}
Slide 51
Slide 51 text
Safe Area
@johnlinvc
༻ Swift UI
struct ContentView: View {
@State var clickCount : Int = 0
var body: some View {
Button(action: add) {
Text("\(clickCount)")
.font(.system(size: 120))
}
}
func add() {
clickCount += 1
}
}
Slide 52
Slide 52 text
Safe Area
@johnlinvc
༻ Swift UI
struct ContentView: View {
@State var clickCount : Int = 0
var body: some View {
Button(action: add) {
Text("\(clickCount)")
.font(.system(size: 120))
}
}
func add() {
DispatchQueue.global().async{
clickCount += 1 }
}
}
Slide 53
Slide 53 text
Safe Area
@johnlinvc
༻ Swift UI
struct ContentView: View {
@State var clickCount : Int = 0
var body: some View {
Button(action: add) {
Text("\(clickCount)")
.font(.system(size: 120))
}
}
func add() {
DispatchQueue.global().async{
clickCount += 1 }
}
}
Slide 54
Slide 54 text
Safe Area
@johnlinvc
༻ Swift UI
• ߋ৽UI ௨ৗੋಁա @State property wrapperɻ
• @State ੋ Thread safe తɻՄҎኺԿ Thread मվଞతᆴɻ
Slide 55
Slide 55 text
Safe Area
@johnlinvc
ղܾํ๏
• ॏෳར༻ view/cell/asset ɻ
• ར༻ଟ֩৺႔ཧثɻ
Slide 56
Slide 56 text
Safe Area
@johnlinvc
ෆಓኺ䬟։࢝վʁ
Slide 57
Slide 57 text
Safe Area
@johnlinvc
෧ʂ෧ʂ࠶෧ʂզཁҝ෧େࢣʂ
Slide 58
Slide 58 text
Safe Area
@johnlinvc
์։ಹݸ MVC
Slide 59
Slide 59 text
Safe Area
@johnlinvc
खखት㟬༻ Clean Swift ॏߏ MVC, ฒସ֩৺ఔࣜᛰḤ
ሜᄸݩଌࢼ
Slide 60
Slide 60 text
Safe Area
@johnlinvc
ዑվᆦʁዑվଠٱʁ
Slide 61
Slide 61 text
Safe Area
@johnlinvc
ኺᘐཱ։ᚙ౸େܕሢҊత CI/CD ߈ུ
Slide 62
Slide 62 text
Safe Area
@johnlinvc
iOS ։ᚙऀ 13 ഒٕ
Slide 63
Slide 63 text
Safe Area
@johnlinvc
ࡏผత thread ၏ࣄతํ๏
• Dispatch
• Combine
Slide 64
Slide 64 text
Safe Area
@johnlinvc
Ռ֩৺શᕝྃʁ
• ਅత༗ଠଟࣄཁ၏ɼबࢉ༻ྃ Dispatch/Combine/async ။㠡ʁ
• ਅతᔒ༗㭎๏ྃ䆩ʁ
Slide 65
Slide 65 text
Safe Area
@johnlinvc
㟬༗ᔒ༗աʁ
• ᙛఔࣜ㠡ॅత࣌ީɼॴ༗తૢ࡞။㠡ॅɻ
• ༗Ұछૢ࡞ෆ။ɼܥ౷㚎ݐతɻ૾ੋ Home 伴ɻ
Slide 66
Slide 66 text
Safe Area
@johnlinvc
ҝॄኄ Home 伴័ੋ༗༻ʁ
• ཧ্ɼᙛఔࣜ㠡ࡏ run loop தత࣌ީɼੋᔒ㭎๏Ꮕᨀ߇ࣄ݅తɻ
• طવᔒ㭎๏Ꮕࣄ݅ɼ্తखጯ֘ᔒ༗Կ࡞༻࠽ሣʁ
Slide 67
Slide 67 text
Safe Area
@johnlinvc
ిᡵՊላܯࠂ
ిᡵՊላ ࠷৽తᐽՍ
ೈᱪఔࢣ
Slide 68
Slide 68 text
Safe Area
@johnlinvc
Darwin-XNU
macOS & iOS ༻తఈ
֩৺
Mach ੋඍ֩৺
BSD ఏڙ POSIX & Unix API
Safe Area
@johnlinvc
ඇ߹࡞ࣜ
• ܥ౷ཁ߇੍ᒟަڅԼҰݸ࣌ɼ။ઃఆҰݸߗᱪܭ࣌ثɻ
• ܭ࣌ث࣌ؒ౸ޙ။ᨀᚙҰݸTrapɼ߇੍ᒟڧ੍ަڅܥ౷ɻ
• Ռ࣌ؒ౸લबަճ߇੍ᒟతɼबॏஔܭ࣌ثɻ
Slide 79
Slide 79 text
Safe Area
@johnlinvc
0x8BADF00D
• Ռ༗ఔࣜաྃٱᔒ༗ਐలɻ
• Darwin ။⬏ಈ WatchDog Timerɻಹݸఔࣜऴࢭɻ
• ࡨޡᛰबੋ 0x8BADF00D, ate bad foodɻ
Slide 80
Slide 80 text
Safe Area
@johnlinvc
Darwin-XNU ༻ඇ߹࡞ࣜ
• ᙛᄸҰఔࣜ㠡ॅత࣌ީɼෆ။Өڹଖଞఔࣜɻ
• ᙛ App 㠡ॅత࣌ީɼ SpringBoard ෆ။ඃӨڹɼॴҎ Home ؐੋՄҎ
ਖ਼ৗӡ࡞ɻ
Slide 81
Slide 81 text
Safe Area
@johnlinvc
ᩋ Run loop ༻ඇ߹࡞?
• ઃఆ㑌ݸ loop ՄҎ༻ိ႔ཧ Event త࣌ؒɻᙛ࣌ؒ౸త࣌ީबڧ੍ަ
ग़߇੍ᒟɻ
• ԼҰݸ loop ࠶᠃߶߶ᔒ၏తࣄɻ
Slide 82
Slide 82 text
Safe Area
@johnlinvc
Bringing Theory Into Practice: A Userspace Library for Multicore
Real-Time Scheduling
• ࡏ Linux త Userspace ্ࣥߦత noncooperative schedulerɻ
• ՄҎࡏ༻ऀతఔࣜ㚎ٖ OS తɻ
• बੋ㘸ɼՄҎᩋ UI ෆ။㠡ॅɻ
Slide 83
Slide 83 text
Safe Area
@johnlinvc
Մೳతመ࡞ํ๏
• ಛత Combine Scheduler ɼᙛ࣌ؒ౸बఀࢭɼԼҰݸ loop ࣗಈॏ
ࢼɻ
• Swift main branch መᱛதత Async/Await + Actorɼᙛᔒ༗ڞڗهԱᱪ
࣌ɼtask बՄҎॏࢼᔒ༗ෆཁత෭࡞༻ɻ
Slide 84
Slide 84 text
Safe Area
@johnlinvc
run loop ඇ߹࡞త᠍ᴍ
• ᔒሜతɼՄೳ။༗ଟ࣍త෭࡞༻ɼ૾ੋ print 䋯ྃၷ࣍ɻ
• ᙘ໘Մೳ။༗ෆతߋ৽ɻҼҝߋ৽౸ҰबඃதᏗྃɻ