├── .gitignore ├── LICENSE ├── README.md ├── WWDC2012 └── WWDC2012_Session211_Building_Concurrent_User_Interfaces_on_iOS │ ├── WWDC2012_Session211_Building_Concurrent_User_Interfaces_on_iOS.md │ ├── p1.png │ ├── p2.png │ ├── p3.png │ ├── p4.png │ └── px.png ├── WWDC2013 ├── WWDC2013_Session217_Exploring_Scroll_Views_in_iOS_7 │ └── WWDC2013_Session217_Exploring_Scroll_Views_in_iOS_7.md ├── WWDC2013_Session226_Implementing_ Engaging_UI_on_iOS │ └── WWDC2013_Session226_Implementing_ Engaging_UI_on_iOS.md └── WWDC2013_Session_224_Designing_Code_for_Performance │ ├── WWDC2013_Session_224_Designing_Code_for_Performance.md │ ├── p1.png │ └── p2.png ├── WWDC2014 ├── .DS_Store ├── WWDC2014_Session221_Creating_Custom_iOS_User_Interface │ └── WWDC2014_Session221_Creating_Custom_iOS_User_Interface.md ├── WWDC2014_Session224_Core_iOS_Application_Architectural_Patterns │ ├── WWDC2014_Session224_Core_iOS_Application_Architectural_Patterns.md │ ├── p1.png │ ├── p2.png │ └── p3.png ├── WWDC2014_Session235_Advanced_Scrollviews_and_Touch_Handling_Techniques │ └── WWDC2014_Session235_Advanced_Scrollviews_and_Touch_Handling_Techniques.md ├── WWDC2014_Session236_Building_Interruptible_and_Responsive_Interactions │ ├── WWDC2014_Session236_Building_Interruptible_and_Responsive_Interactions.md │ ├── vlcsnap-2015-08-24-11h53m27s246.png │ ├── vlcsnap-2015-08-24-11h55m43s713.png │ ├── vlcsnap-2015-08-24-13h21m46s063.png │ ├── vlcsnap-2015-08-24-13h22m22s499.png │ ├── vlcsnap-2015-08-24-13h22m28s162.png │ └── vlcsnap-2015-08-24-14h48m04s032.png ├── WWDC2014_Session237_A_Strategy_for_Great_Work │ ├── WWDC2014_Session237_A_Strategy_for_Great_Work.md │ ├── p1.png │ └── p2.png └── WWDC2014_Session418_Improving_Your_App_with_Instruments │ └── WWDC2014_Session418_Improving_Your_App_with_Instruments.md ├── WWDC2015 ├── WWDC2015_Session230_Performance_on_iOS_and_watchOS │ └── WWDC2015_Session230_Performance_on_iOS_and_watchOS.md ├── WWDC2015_Session231_Cocoa_Touch_Best_Practices │ └── WWDC2015_Session231_Cocoa_Touch_Best_Practices.md ├── WWDC2015_Session411_Swift_in_Practice │ └── WWDC2015_Session411_Swift_in_Practice.md └── WWDC2015_Session413_Advanced_Debugging_and_the_Address_Sanitizer │ ├── BreakpointsList.png │ └── WWDC2015_Session413_Advanced_Debugging_and_the_Address_Sanitizer.md ├── WWDC2016 ├── .DS_Store ├── WWDC2016_Session301_Introducing_Expanded_Subscriptions_in_iTunes_Connect │ └── WWDC2016_Session301_Introducing_Expanded_Subscriptions_in_iTunes_Connect.md ├── WWDC2016_Session403_Swift_API_Design_Guidelines │ └── WWDC2016_Session403_Swift_API_Design_Guidelines.md └── WWDC2016_Session418_Using_Time_Profiler_In_Instruments │ └── WWDC2016_Session418_Using_Time_Profiler_In_Instruments.md ├── WWDC2018 └── WWDC2018_Session705_Engineering_Subscriptions │ └── WWDC2018_Session705_Engineering_Subscriptions.md ├── WWDC2019 ├── WWDC2019_Session239_Great_Developer_Habits │ └── WWDC2019_Session239_Great_Developer_Habits.md ├── WWDC2019_Session412_Debugging_in_Xcode_11 │ └── WWDC2019_Session412_Debugging_in_Xcode_11.md └── WWDC2019_Session901_Whats_New_in_Core_Bluetooth │ └── WWDC2019_Session901_Whats_New_in_Core_Bluetooth.md ├── WWDC2020 ├── WWDC2020_Session10176_Master_Picture_in_Picture_on_tvOS │ └── WWDC2020_Session10176_Master_Picture_in_Picture_on_tvOS.md └── WWDC2020_Session10654_Create_Swift_Playgrounds_content_for_iPad_and_Mac │ └── WWDC2020_Session10654_Create_Swift_Playgrounds_content_for_iPad_and_Mac.md ├── _config.yml ├── push_with_msg.sh └── tmp.txt /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Antonio081014 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | --- 3 | 4 | 5 | # WWDC Learning Notes 6 | Present what I learned from WWDC each year. Purpose to work as a Learning Note 7 | 8 | ## WWDC 2024 9 | - [x] 101 Keynote 10 | - [x] 2023 Meet FinanceKit 11 | - [x] 10136 What's new in Swift 12 | - [x] 10144 What's new in SwiftUI 13 | - [x] 10146 Demystify SwiftUI containers 14 | - [x] 10150 SwiftUI essentials 15 | - [x] 10188 What's new in SF Symbols 6 16 | - [x] 10198 Run, Break, Inspect: Explore effective debugging in LLDB 17 | 18 | ## WWDC 2023 19 | - [x] 101 Keynote 20 | - [x] 102 Platforms State of the Union 21 | - [x] 10149 Discover Observation in SwiftUI 22 | - [x] 10154 Build an app with SwiftData 23 | - [x] 10159 Beyond scroll views 24 | - [x] 10161 Inspectors in SwiftUI: Discover the details 25 | - [x] 10162 The SwiftUI cookbook for focus 26 | - [x] 10165 What's new in Xcode 15 27 | - [x] 10187 Meet SwiftData 28 | - [x] 10195 Model your schema with SwiftData 29 | - [x] 10248 Analyze Hangs with Instruments 30 | - [x] 10257 Create animated symbols 31 | - [x] 111486 17 big & little things at WWDC23 32 | - [x] 111488 What Apple developers need to know at WWDC23 33 | 34 | ## WWDC 2022 35 | - [x] 101 Keynote 36 | - [x] 102 Platforms State of Union 37 | - [x] 10050 Complications and widgets: Reloaded 38 | - [x] 10052 What's new in SwiftUI 39 | - [x] 10054 The SwiftUI cookbook for navigation 40 | - [x] 10056 Compose custom layouts with SwiftUI 41 | - [x] 10058 SwiftUI on iPad: Organize your interface 42 | - [x] 10059 The craft of SwiftUI API design: Progressive disclosure 43 | - [x] 10061 Bring multiple windows to your SwiftUI app 44 | - [x] 10068 What's new in UIKit 45 | - [x] 10136 Hello Swift Charts 46 | - [x] 10137 Swift Charts: Raise the bar 47 | - [x] 10142 Efficiency awaits: Background tasks in SwiftUI 48 | - [x] 10157 What's new in SF Symbols 4 49 | - [x] 110340 Design an effective chart 50 | - [x] 110342 Design app experiences with charts 51 | - [x] 110343 SwiftUI on iPad: Add toolbars, titles, and more 52 | - [x] 110344 Get to know Developer Mode 53 | - [x] 110350 Visualize and optimize Swift concurrency 54 | - [x] 110351 Eliminate data races using Swift Concurrency 55 | - [x] 110355 Meet Swift Async Algorithms 56 | - [x] 110371 Use Xcode to develop a multiplatform app 57 | - [x] 110427 What's new in Xcode 58 | 59 | 60 | ## WWDC 2021 61 | - [x] 101 Keynote 62 | - [ ] 102 Platforms State of the Union 63 | - [x] 10015 Build apps that share data through CloudKit and Core Data 64 | - [x] 10019 Discover concurrency in SwiftUI 65 | - [x] 10023 Direct and reflect focus in SwiftUI 66 | - [x] 10041 Extract document data using Vision 67 | - [x] 10058 Meet AsyncSequence 68 | - [x] 10059 What's new in UIKit 69 | - [x] 10063 Customize and resize sheets in UIKit 70 | - [x] 10064 Meet the UIKit button system 71 | - [x] 10095 Use async/await with URLSession 72 | - [x] 10097 What’s new in SF Symbols 73 | - [x] 10115 What's new in App Analytics 74 | - [x] 10119 SwiftUI Accessibility: Beyond the basics 75 | - [x] 10132 Meet async/await in Swift 76 | - [x] 10134 Explore structured concurrency in Swift 77 | - [x] 10157 Make blazing fast lists and collection views 78 | - [x] 10171 Meet in-app events on the App Store 79 | - [x] 10191 Deliver a great playback experience 80 | - [x] 10251 SF Symbols in UIKit and AppKit 81 | - [x] 10288 Explore the SF Symbols 3 app 82 | - [x] 10295 Get ready to optimize your App Store product page 83 | - [x] 10349 SF Symbols in SwiftUI 84 | 85 | ## WWDC 2020 86 | - [x] 101 Keynote 87 | - [x] 102 Platforms State of the Union 88 | - [x] 10026 Lists in UICollectionView 89 | - [x] 10027 Modern cell configuration 90 | - [x] 10028 Meet Widget 91 | - [x] 10031 Stacks, Grids, and Outlines in SwiftUI 92 | - [x] 10034 Widget Code-along, part 1: The adventure begins 93 | - [x] 10040 Data Essentials in SwiftUI 94 | - [x] 10045 Advances in diffable data sources 95 | - [x] 10081 What's new in MetricKit 96 | - [x] 10086 Design for intelligence: Apps, evolved 97 | - [x] 10088 Design for intelligence: Discover new opportunities 98 | - [x] 10097 Advances in UICollectionView 99 | - [x] 10105 Build for iPad 100 | - [x] 10119 Introduction to SwiftUI 101 | - [x] 10168 Explore logging in Swift 102 | - [x] 10176 Master Picture in Picture on tvOS 103 | - [x] 10177 Eliminate animation hitches with XCTest 104 | - [x] 10182 What's new in HealthKit 105 | - [x] 10200 Design for intelligence: Meet people where they are 106 | - [x] 10203 Triage TestFlight crashes in Xcode Organizer 107 | - [x] 10206 Designed for iPad 108 | - [x] 10650 Sync a Core Data store with the CloudKit public database 109 | - [x] [10654 Create Swift Playgrounds content for iPad and Mac](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2020/WWDC2020_Session10654_Create_Swift_Playgrounds_content_for_iPad_and_Mac/WWDC2020_Session10654_Create_Swift_Playgrounds_content_for_iPad_and_Mac.md) 110 | - [x] 10658 What's new in education 111 | - [x] 10666 One-tap account security upgrades 112 | - [x] 10681 Swan's Quest, Chapter 1: Voices in the dark 113 | 114 | ## WWDC 2019 115 | - [x] 101 Keynote 116 | - [x] 103 Platforms State of the Union 117 | 118 | - [x] 202 Using Core Data with CloudKit 119 | - [x] 214 Implementing Dark Mode on iOS 120 | - [x] 220 Advances in UI Data Sources 121 | - [x] 230 Making Apps with Core Data 122 | - [x] [239 Great Developer Habits](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2019/WWDC2019_Session239_Great_Developer_Habits/WWDC2019_Session239_Great_Developer_Habits.md) 123 | 124 | - [x] 401 What's New in Xcode 11 125 | - [x] 402 What's New in Swift 126 | - [x] 411 Getting Started with Instruments 127 | - [x] [412 Debugging in Xcode 11](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2019/WWDC2019_Session412_Debugging_in_Xcode_11/WWDC2019_Session412_Debugging_in_Xcode_11.md) 128 | - [x] 506 HEVC Video with Alpha 129 | - [x] 706 Introducing Sign In with Apple 130 | - [X] 723 Advances in Foundation 131 | 132 | - [x] 805 Building Great Shortcuts 133 | - [x] 808 What's New in iOS Design 134 | 135 | - [x] [901 What's new in Core Bluetooth](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2019/WWDC2019_Session901_Whats_New_in_Core_Bluetooth/WWDC2019_Session901_Whats_New_in_Core_Bluetooth.md) 136 | 137 | ## WWDC 2018 138 | 139 | - [x] 101 Keynote 140 | 141 | ### App Frameworks 142 | - [x] 202 What's New in Cocoa Touch 143 | - [x] 203 I Have This Idea For An App... 144 | - [x] 220 High Performance Auto Layout 145 | - [x] 223 Embracing Algorithms 146 | - [x] 224 Core Data Best Practice 147 | - [x] 225 A Tour of UICollectionView 148 | - [x] 235 UIKit: Apps for Every Size and Shape 149 | 150 | - [x] 301 What's New in App Store Connect 151 | - [x] 303 Automating App Store Connect 152 | ### Developer Tools 153 | - [x] 411 Getting to Know Swift Package Manager 154 | - [x] 418 Source Control Workflows in Xcode 155 | 156 | ### System Frameworks 157 | - [x] 704 Best Practics and What's New with In-App Purchases 158 | 159 | ### Design 160 | - [x] 804 The Life of a Button 161 | - [x] 811 Presenting Design Work 162 | 163 | 164 | ## WWDC 2017 165 | 166 | ### Featured 167 | - [x] 101 Keynote 168 | - [x] 102 Platforms State of the Union 169 | - [ ] 106 From Monroe to NASA 170 | - [ ] 110 Convenience for You is Independence for Me 171 | 172 | ### App Frameworks 173 | - [ ] 201 What's New in Cocoa Touch 174 | - [ ] 202 Advances in TVMLKit 175 | - [ ] 203 Introducing Drag and Drop 176 | - [ ] 204 Updating Your App for iOS 11 177 | - [ ] 205 What's New in watchOS 178 | - [ ] 206 Introducing Password AutoFill for Apps 179 | - [ ] 207 What's New in Cocoa 180 | - [ ] 208 Natural Language Processing and your Apps 181 | - [ ] 209 What's New in tvOS 182 | - [ ] 210 What's New in Core Data 183 | - [ ] 211 Touch Bar Fundamentals 184 | - [ ] 212 What's New in Foundation 185 | - [ ] 213 Mastering Drag and Drop 186 | - [ ] 214 What's New in SiriKit 187 | - [ ] 215 What's New in Accessibility 188 | - [ ] 216 The Life of a watchOS App 189 | - [ ] 217 Media and Gaming Accessibility 190 | - [ ] 218 Choosing the Right Cocoa Container View 191 | - [ ] 219 Modern User Interaction on iOS 192 | - [ ] 220 Customized Loading in WKWebView 193 | - [ ] 221 What's New in Health 194 | - [ ] 222 Advanced Touch Bar 195 | - [ ] 223 Drag and Drop with Collection and Table View 196 | - [ ] 224 Focus Interaction in tvOS 11 197 | - [ ] 225 What's New in Safari View Controller 198 | - [ ] 226 Build Better Apps with CloudKit Dashboard 199 | - [ ] 227 Data Delivery with Drag and Drop 200 | - [ ] 228 Making Great SiriKit Experiences 201 | - [ ] 229 Building Great Document-based Apps in iOS 11 202 | - [x] 230 Advanced Animations with UIKit 203 | - [ ] 231 What's New in Core Spotlight for iOS and macOS 204 | - [ ] 232 What's New in CareKit and ResearchKit 205 | - [ ] 234 What's New in iMessage Apps 206 | - [ ] 235 Building Visually Rich User Experiences 207 | - [ ] 236 Cocoa Development Tips 208 | - [ ] 237 What's New in MapKit 209 | - [ ] 238 Writing Energy Efficient Apps 210 | - [ ] 239 Connecting CareKit to the Cloud 211 | - [ ] 240 Introducing Business Chat 212 | - [ ] 241 Introducing PDFKit on iOS 213 | - [ ] 242 The Keys to a Better Text Input Experience 214 | - [ ] 243 File Provider Enhancements 215 | - [ ] 244 Efficient Interactions with Frameworks 216 | - [ ] 245 Building Apps with Dynamic Type 217 | - [x] 246 Deep Linking on tvOS 218 | - [ ] 247 Extend Your App's Presence With Sharing 219 | - [ ] 248 Localization Best Practices on tvOS 220 | - [ ] 249 Filtering Unwanted Messages with Identity Lookup 221 | - [ ] 250 Extend Your App’s Presence with Deep Linking 222 | - [ ] 251 Now Playing and Remote Commands on tvOS 223 | 224 | ### Distribution 225 | - [x] 301 Introducing the New App Store 226 | - [ ] 302 What's New in iTunes Connect 227 | - [ ] 303 What's New in StoreKit 228 | - [ ] 304 What's New in Device Configuration, Deployment, and Management 229 | - [ ] 305 Advanced StoreKit 230 | 231 | ### Developer Tools 232 | - [ ] 401 Localizing with Xcode 9 233 | - [ ] 402 What's New in Swift 234 | - [ ] 403 What's New in Signing for Xcode and Xcode Server 235 | - [ ] 404 Debugging with Xcode 9 236 | - [ ] 405 GitHub and the New Source Control Workflows in Xcode 9 237 | - [ ] 406 Finding Bugs Using Xcode Runtime Tools 238 | - [ ] 407 Understanding Undefined Behavior 239 | - [ ] 408 What’s New in Swift Playgrounds 240 | - [ ] 409 What's New in Testing 241 | - [ ] 410 Localizing Content for Swift Playgrounds 242 | - [ ] 411 What's New in LLVM 243 | - [ ] 412 Auto Layout 244 | niques in Interface Builder 245 | - [ ] 413 App Startup Time: Past, Present, and Future 246 | - [ ] 414 Engineering for Testability 247 | - [ ] 416 Teaching with Swift Playgrounds 248 | 249 | ### Media 250 | - [ ] 501 What's New in Audio 251 | - [ ] 502 Introducing MusicKit 252 | - [ ] 503 Introducing HEIF and HEVC 253 | - [ ] 504 Advances in HTTP Live Streaming 254 | - [ ] 505 What's New in Photos APIs 255 | - [ ] 506 Vision Framework: Building on Core ML 256 | - [ ] 507 Capturing Depth in iPhone Photography 257 | - [ ] 508 Image Editing with Depth 258 | - [ ] 509 Introducing AirPlay 2 259 | - [ ] 510 Advances in Core Image: Filters, Metal, Vision, and More 260 | - [ ] 511 Working with HEIF and HEVC 261 | - [ ] 512 Apple Podcasts 262 | - [ ] 513 High Efficiency Image File Format 263 | - [ ] 514 Error Handling Best Practices for HTTP Live Streaming 264 | - [ ] 515 HLS Authoring Update 265 | 266 | ### Graphics and Games 267 | - [ ] 601 Introducing Metal 2 268 | - [ ] 602 Introducing ARKit: Augmented Reality for iOS 269 | - [ ] 603 VR with Metal 2 270 | - [ ] 604 SceneKit: What's New 271 | - [ ] 605 SceneKit in Swift Playgrounds 272 | - [ ] 606 What's New with Screen Recording and Live Broadcast 273 | - [ ] 607 Metal 2 Optimization and Debugging 274 | - [ ] 608 Using Metal 2 for Compute 275 | - [ ] 609 Going Beyond 2D with SpriteKit 276 | - [ ] 610 From Art to Engine with Model I/O 277 | 278 | ### System Frameworks 279 | - [ ] 701 Your Apps and Evolving Network Security Standards 280 | - [ ] 702 Privacy and Your Apps 281 | - [x] 703 Introducing Core ML 282 | - [ ] 704 Creating Immersive Apps with Core Motion 283 | - [ ] 705 What's New in HomeKit 284 | - [ ] 706 Modernizing Grand Central Dispatch Usage 285 | - [ ] 707 Advances in Networking, Part 1 286 | - [ ] 708 Best Practices and What’s New in User Notifications 287 | - [ ] 709 Advances in Networking, Part 2 288 | - [ ] 710 Core ML in depth 289 | - [ ] 711 Accelerate and Sparse Solvers 290 | - [ ] 712 What's New in Core Bluetooth 291 | - [ ] 713 What's New in Location Technologies 292 | - [ ] 714 What's New in Apple Pay & Wallet 293 | - [ ] 715 What's new in Apple File System 294 | - [ ] 716 iOS Configuration and APIs for Kiosk and Assessment Apps 295 | - [ ] 717 Developing Wireless CarPlay Systems 296 | - [ ] 718 Introducing Core NFC 297 | - [ ] 719 Enabling Your App for CarPlay 298 | 299 | ### Design 300 | - [ ] 802 Essential Design Principles 301 | - [ ] 803 Designing Sound 302 | - [ ] 804 Designing Across Platforms 303 | - [ ] 806 Design For Everyone 304 | - [ ] 808 Planning a Great Apple Watch Experience 305 | - [x] 809 Communication Between Designers and Engineers 306 | - [ ] 810 What’s New in iOS 11 307 | - [ ] 811 Design Tips for Great Games 308 | - [x] 812 Size Classes and Core Components 309 | - [ ] 813 Writing Great Alerts 310 | - [x] 814 Designing for Subscription Success 311 | - [ ] 815 How to Pick a Custom Font 312 | - [ ] 816 Love at First Launch 313 | - [ ] 817 Rich Notifications 314 | - [x] 818 60 Second Prototyping 315 | - [ ] 819 Designing for a Global Audience 316 | - [ ] 820 Express Yourself! 317 | - [ ] 821 Get Started with Display P3 318 | - [x] 822 App Icon Design 319 | - [ ] 823 Designing Glyphs 320 | 321 | ## WWDC 2016 322 | 323 | ### Featured 324 | - [x] 101 Keynote 325 | - [ ] 102 Platforms State of the Union 326 | - [ ] 103 Apple Design Awards 327 | - [ ] 104 Disability and Innovation: The Universal Benefits of Accessible Design 328 | - [ ] 106 Talking In Pictures: Reconstructing the Building Blocks of Language 329 | 330 | ### App Frameworks 331 | 332 | - [ ] 201 Internationalization Best Practices 333 | - [ ] 202 What's New in Accessibility 334 | - [ ] 203 What's New in Cocoa 335 | - [ ] 204 iMessage Apps and Stickers, Part 1 336 | - [x] 205 What's New in Cocoa Touch 337 | - [ ] 206 What's New in tvOS 338 | - [ ] 207 What's New in Foundation for Swift 339 | - [ ] 208 What's New in watchOS 3 340 | - [ ] 209 Getting the Most Out of HealthKit 341 | - [ ] 210 Mastering UIKit on tvOS 342 | - [ ] 211 Quick Interaction Techniques for watchOS 343 | - [ ] 212 Developing tvOS Apps Using TVMLKit: Part 1 344 | - [ ] 213 Improving Existing Apps with Modern Best Practices 345 | - [ ] 214 Extending your App with Safari App Extensions 346 | - [ ] 215 Focus Interaction on tvOS 347 | - [ ] 216 Advances in UIKit Animations and Transitions 348 | - [ ] 217 Introducing SiriKit 349 | - [ ] 218 Keeping Your Watch App Up to Date 350 | - [ ] 219 What's New in UICollectionView in iOS 10 351 | - [ ] 220 Leveraging Touch Input on iOS 352 | - [ ] 221 Optimizing On-Demand Resources 353 | - [ ] 222 Making Apps Adaptive, Part 1 354 | - [ ] 223 Making the Most of Search APIs 355 | - [ ] 224 iMessage Apps and Stickers, Part 2 356 | - [ ] 225 Extending Your Apps with SiriKit 357 | - [ ] 226 What's New with CloudKit 358 | - [ ] 227 Architecting for Performance on watchOS 3 359 | - [ ] 228 A Peek at 3D Touch 360 | - [ ] 229 Developing tvOS Apps Using TVMLKit: Part 2 361 | - [ ] 230 Enhancing VoIP Apps with CallKit 362 | - [ ] 231 CloudKit Best Practices 363 | - [ ] 232 What's New in International User Interfaces 364 | - [ ] 233 Making Apps Adaptive, Part 2 365 | - [ ] 234 What's New in ResearchKit 366 | - [ ] 235 Building Great Workout Apps 367 | - [x] 236 What's New in Auto Layout 368 | - [ ] 237 Getting Started with CareKit 369 | - [ ] 238 Measurements and Units 370 | - [ ] 239 Crafting Modern Cocoa Apps 371 | - [ ] 240 Increase Usage of Your App With Proactive Suggestions 372 | - [ ] 241 Public Transit in Apple Maps 373 | - [x] 242 What's New in Core Data 374 | 375 | ### Distribution 376 | 377 | - [x] 301 Introducing Expanded Subscriptions in iTunes Connect 378 | - [ ] 302 Introducing Search Ads 379 | - [ ] 303 What's New in Apple Device Management 380 | - [ ] 304 Best Practices for Building Apps Used in Business and Education 381 | - [x] 305 What's New in iTunes Connect 382 | 383 | ### Developer Tools 384 | 385 | - [ ] 401 What's New in Xcode App Signing 386 | - [ ] 402 What's New in Swift 387 | - [x] [403 Swift API Design Guidelines](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2016/WWDC2016_Session403_Swift_API_Design_Guidelines/WWDC2016_Session403_Swift_API_Design_Guidelines.md) 388 | - [ ] 404 Getting Started with Swift 389 | - [ ] 405 What's New in LLVM 390 | - [ ] 406 Optimizing App Startup Time 391 | - [ ] 407 Auditing Your Apps for Accessibility 392 | - [ ] 408 Introducing Swift Playgrounds 393 | - [ ] 409 Advanced Testing and Continuous Integration 394 | - [ ] 410 Visual Debugging with Xcode 395 | - [ ] 411 System Trace in Depth 396 | - [ ] 412 Thread Sanitizer and Static Analysis 397 | - [ ] 413 Introduction to Xcode 398 | - [ ] 414 Using and Extending the Xcode Source Editor 399 | - [ ] 415 Going Server-side with Swift Open Source 400 | - [ ] 416 Understanding Swift Performance 401 | - [ ] 417 Debugging Tips and Tricks 402 | - [ ] [418 Using Time Profiler in Instruments](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2016/WWDC2016_Session418_Using_Time_Profiler_In_Instruments/WWDC2016_Session418_Using_Time_Profiler_In_Instruments.md) 403 | - [ ] 419 Protocol and Value Oriented Programming in UIKit Apps 404 | - [ ] 420 Optimizing Web Content in Your App 405 | 406 | ### Media 407 | 408 | - [ ] 501 Advances in iOS Photography 409 | - [ ] 502 Getting Published in Apple News 410 | - [ ] 503 Advances in AVFoundation Playback 411 | - [ ] 504 What's New in HTTP Live Streaming 412 | - [ ] 505 Live Photo Editing and RAW Processing with Core Image 413 | - [ ] 506 AVKit on tvOS 414 | - [ ] 507 Delivering an Exceptional Audio Experience 415 | - [ ] 508 Using Apple News Format to Create Rich and Responsive Stories 416 | - [ ] 509 Speech Recognition API 417 | - [ ] 510 HTTP Live Streaming Authoring and Validation 418 | - [ ] 511 AVCapturePhotoOutput - Beyond the Basics 419 | 420 | ### Graphics and Games 421 | 422 | - [ ] 601 Go Live with ReplayKit 423 | - [ ] 602 Adopting Metal, Part 1 424 | - [ ] 603 Adopting Metal, Part 2 425 | - [ ] 604 What's New in Metal, Part 1 426 | - [ ] 605 What's New in Metal, Part 2 427 | - [ ] 606 Advanced Metal Shader Optimization 428 | - [ ] 607 Controlling Game Input for Apple TV 429 | - [ ] 608 What's New in GameplayKit 430 | - [ ] 609 Advances in SceneKit Rendering 431 | - [ ] 610 What's New in SpriteKit 432 | - [ ] 611 What's New in Game Center 433 | - [ ] 612 Game Technologies for Apple Watch 434 | 435 | ### System Frameworks 436 | 437 | - [ ] 701 Introducing Apple File System 438 | - [ ] 702 Using Store Kit for In-App Purchases with Swift 3 439 | - [ ] 703 Apple Pay on the Web 440 | - [ ] 704 What's New with Wallet and Apple Pay 441 | - [ ] 705 How iOS Security Really Works 442 | - [ ] 706 What's New in Security 443 | - [ ] 707 Introduction to Notifications 444 | - [ ] 708 Advanced Notifications 445 | - [ ] 709 Engineering Privacy for Your Users 446 | - [ ] 710 What's New in HomeKit 447 | - [ ] 711 NSURLSession: New Features and Best Practices 448 | - [ ] 712 Working with Wide Color 449 | - [ ] 713 Health and Fitness with Core Motion 450 | - [ ] 714 Networking for the Modern Internet 451 | - [ ] 715 Neural Networks and Accelerate 452 | - [ ] 716 Core Location Best Practices 453 | - [ ] 717 Beyond Dictation — Enhanced Voice-Control for macOS apps 454 | - [ ] 719 Optimizing I/O for Performance and Battery Life 455 | - [ ] 720 Concurrent Programming With GCD in Swift 3 456 | - [ ] 721 Unified Logging and Activity Tracing 457 | - [ ] 722 Developing CarPlay Systems, Part 1 458 | - [ ] 723 Developing CarPlay Systems, Part 2 459 | - [ ] 724 What's New in the Apple Push Notification Service 460 | - [ ] 725 Deploying AirPrint in Enterprise 461 | 462 | ### Design 463 | 464 | - [ ] 801 Inclusive App Design 465 | - [ ] 802 Designing for tvOS 466 | - [ ] 803 Typography and Fonts 467 | - [ ] 804 Designing Great Apple Watch Experiences 468 | - [x] 805 Iterative UI Design 469 | 470 | ## WWDC 2015 471 | 472 | ### Featured 473 | - [ ] 101 Keynote 474 | - [ ] 102 Platforms State of the Union 475 | - [ ] 103 Apple Design Awards 476 | - [x] 104 What's New in Xcode 477 | - [ ] 105 Introducing WatchKit for watchOS 2 478 | - [ ] 106 What's New in Swift 479 | - [ ] 107 What's New in Cocoa Touch 480 | - [ ] 108 Building Watch Apps 481 | - [ ] 112 Think Audacious 482 | 483 | ### App Frameworks 484 | - [ ] 201 iOS Accessibility 485 | - [ ] 202 What's New in Cocoa 486 | - [ ] 203 What's New in HealthKit 487 | - [ ] 204 Apple Watch Accessibility 488 | - [ ] 205 Getting Started with Multitasking on iPad in iOS 9 489 | - [ ] 206 What's New in MapKit 490 | - [ ] 207 WatchKit In-Depth, Part 1 491 | - [ ] 208 WatchKit In-Depth, Part 2 492 | - [ ] 209 Creating Complications with ClockKit 493 | - [ ] 210 What's New in HomeKit 494 | - [ ] 211 Multitasking Essentials for Media-Based Apps on iPad in iOS 9 495 | - [ ] 212 Optimizing Your App for Multitasking on iPad in iOS 9 496 | - [ ] 213 Building Apps with ResearchKit 497 | - [ ] 214 Introducing On Demand Resources 498 | - [ ] 215 What's New in Storyboards 499 | - [ ] 216 Layout and Animation Techniques for WatchKit 500 | - [ ] 217 Adopting New Trackpad Features 501 | - [x] 218 Mysteries of Auto Layout, Part 1 502 | - [x] 219 Mysteries of Auto Layout, Part 2 503 | - [ ] 220 What's New in Core Data 504 | - [ ] 221 Improving the Full Screen Window Experience 505 | - [ ] 222 New UIKit Support for International User Interfaces 506 | - [ ] 223 Introducing the Contacts Framework for iOS and OS X 507 | - [ ] 224 App Extension Best Practices 508 | - [ ] 225 What's New in NSCollectionView 509 | - [ ] 226 Advanced NSOperations 510 | - [ ] 227 What's New in Internationalization 511 | - [ ] 228 WatchKit Tips and Tricks 512 | - [ ] 229 What's New in UIKit Dynamics and Visual Effects 513 | - [x] [230 Performance on iOS and watchOS](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2015/WWDC2015_Session230_Performance_on_iOS_and_watchOS/WWDC2015_Session230_Performance_on_iOS_and_watchOS.md) 514 | - [x] [231 Cocoa Touch Best Practices](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2015/WWDC2015_Session231_Cocoa_Touch_Best_Practices/WWDC2015_Session231_Cocoa_Touch_Best_Practices.md) 515 | - [ ] 232 Best Practices for Progress Reporting 516 | - [ ] 233 Advanced Touch Input on iOS 517 | - [ ] 234 Building Document Based Apps 518 | - [ ] 504 Introducing Safari View Controller 519 | - [ ] 509 Seamless Linking to Your App 520 | 521 | ### Distribution 522 | - [ ] 301 What's New in Managing Apple Devices 523 | - [ ] 302 What's New in iTunes Connect 524 | - [ ] 303 Getting the Most out of App Analytics 525 | - [x] 304 iTunes Connect: Development to Distribution 526 | - [ ] 306 Supporting the Enterprise with OS X Automation 527 | 528 | ### Developer Tools 529 | - [ ] 401 Swift and Objective-C Interoperability 530 | - [ ] 402 What's New in LLDB 531 | - [ ] 403 Improving Your Existing Apps with Swift 532 | - [ ] 404 App Thinning in Xcode 533 | - [ ] 405 Authoring Rich Playgrounds 534 | - [ ] 406 UI Testing in Xcode 535 | - [ ] 407 Implementing UI Designs in Interface Builder 536 | - [ ] 408 Protocol-Oriented Programming in Swift 537 | - [ ] 409 Optimizing Swift Performance 538 | - [ ] 410 Continuous Integration and Code Coverage in Xcode 539 | - [x] [411 Swift in Practice](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2015/WWDC2015_Session411_Swift_in_Practice/WWDC2015_Session411_Swift_in_Practice.md) 540 | - [x] 412 Profiling in Depth 541 | - [x] [413 Advanced Debugging and the Address Sanitizer](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2015/WWDC2015_Session413_Advanced_Debugging_and_the_Address_Sanitizer/WWDC2015_Session413_Advanced_Debugging_and_the_Address_Sanitizer.md) 542 | - [ ] 414 Building Better Apps with Value Types in Swift 543 | 544 | ###Media 545 | - [ ] 501 What's New in Web Development in WebKit and Safari 546 | - [ ] 502 Content Protection for HTTP Live Streaming 547 | - [ ] 503 Monetize and Promote Your App with iAd 548 | - [ ] 505 Using Safari to Deliver and Debug a Responsive Web Design 549 | - [ ] 506 Editing Movies in AV Foundation 550 | - [ ] 507 What's New in Core Audio 551 | - [ ] 508 Audio Unit Extensions 552 | - [ ] 510 What's New in Core Image 553 | - [ ] 511 Safari Extensibility: Content Blocking and Shared Links 554 | 555 | ### Graphics and Games 556 | - [ ] 602 Managing 3D Assets with Model I/O 557 | - [ ] 603 What's New in Metal, Part 1 558 | - [ ] 604 What's New in SpriteKit 559 | - [ ] 605 Going Social with ReplayKit and Game Center 560 | - [ ] 606 Enhancements to SceneKit 561 | - [ ] 607 What's New in Metal, Part 2 562 | - [ ] 608 Introducing GameplayKit 563 | - [ ] 609 Deeper into GameplayKit with DemoBots 564 | - [ ] 610 Metal Performance Optimization Techniques 565 | 566 | ### System Frameworks 567 | - [ ] 701 Wallet - The home for Apple Pay and more 568 | - [ ] 702 Apple Pay Within Apps 569 | - [ ] 703 Privacy and Your App 570 | - [ ] 704 What's New in CloudKit 571 | - [ ] 705 What's New in Core Motion 572 | - [ ] 706 Security and Your Apps 573 | - [ ] 707 Achieving All-day Battery Life 574 | - [ ] 708 Debugging Energy Issues 575 | - [ ] 709 Introducing App Search 576 | - [ ] 710 CloudKit JS and Web Services 577 | - [ ] 711 Networking with NSURLSession 578 | - [ ] 712 Low Energy, High Performance: Compression and Accelerate 579 | - [ ] 713 Introducing Watch Connectivity 580 | - [ ] 714 What's New in Core Location 581 | - [ ] 715 CloudKit Tips and Tricks 582 | - [ ] 717 What's New in Network Extension and VPN 583 | - [ ] 718 Building Responsive and Efficient Apps with GCD 584 | - [ ] 719 Your App and Next Generation Networks 585 | - [ ] 720 What's New in Notifications 586 | 587 | ### Design 588 | - [ ] 801 Designing for Future Hardware 589 | - [ ] 802 Designing for Apple Watch 590 | - [ ] 803 Designing with Animation 591 | - [ ] 804 Introducing the New System Fonts 592 | - [ ] 805 Apple Watch Design Tips and Tricks 593 | 594 | ## WWDC 2014 595 | ### Special Events 596 | - [ ] 101 Keynote 597 | - [ ] 102 Platforms State of the Union 598 | - [ ] 103 Apple Design Awards 599 | 600 | ### Frameworks 601 | - [ ] 201 Advanced Topics in Internationalization 602 | - [ ] 202 What's New in Cocoa Touch 603 | - [ ] 203 Introducing HealthKit 604 | - [ ] 204 What's New in Cocoa 605 | - [ ] 205 Creating Extensions for iOS and OS X, Part 1 606 | - [ ] 206 Introducing the Modern WebKit API 607 | - [ ] 207 Accessibility on OS X 608 | - [ ] 208 Introducing CloudKit 609 | - [ ] 209 Adapting Your App to the New UI of OS X Yosemite 610 | - [ ] 210 Accessibility on iOS 611 | - [ ] 211 Designing Intuitive User Experiences 612 | - [ ] 212 Storyboards and Controllers on OS X 613 | - [ ] 213 Introducing HomeKit 614 | - [ ] 214 View Controller Advancements in iOS 8 615 | - [ ] 216 Building Adaptive Apps with UIKit 616 | - [ ] 217 Creating Extensions for iOS and OS X, Part 2 617 | - [ ] 218 Designing a Great In-App Purchase Experience 618 | - [ ] 219 Adopting Handoff on iOS and OS X 619 | - [ ] 220 Adopting Advanced Features of the New UI of OS X Yosemite 620 | - [x] [221 Creating Custom iOS User Interfaces](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2014/WWDC2014_Session221_Creating_Custom_iOS_User_Interface/WWDC2014_Session221_Creating_Custom_iOS_User_Interface.md) 621 | - [ ] 222 Optimize Your Earning Power With iAd 622 | - [x] 223 Prototyping: Fake It Till You Make It 623 | - [x] [224 Core iOS Application Architectural Patterns](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2014/WWDC2014_Session224_Core_iOS_Application_Architectural_Patterns/WWDC2014_Session224_Core_iOS_Application_Architectural_Patterns.md) 624 | - [ ] 225 What's New in Core Data 625 | - [x] 226 What's New in Table and Collection Views 626 | - [ ] 227 Creating Modern Cocoa Apps 627 | - [ ] 228 A Look Inside Presentation Controllers 628 | - [ ] 229 Advanced iOS Application Architecture and Patterns 629 | - [ ] 230 Making a Great First Impression With Strong Onboarding Design 630 | - [ ] 231 Advanced CloudKit 631 | - [ ] 232 Advanced User Interfaces with Collection Views 632 | - [ ] 233 Sharing code between iOS and OS X 633 | - [ ] 234 Building a Document-based App 634 | - [x] [235 Advanced Scrollviews and Touch Handling Techniques](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2014/WWDC2014_Session235_Advanced_Scrollviews_and_Touch_Handling_Techniques/WWDC2014_Session235_Advanced_Scrollviews_and_Touch_Handling_Techniques.md) 635 | - [x] [236 Building Interruptible and Responsive Interactions](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2014/WWDC2014_Session236_Building_Interruptible_and_Responsive_Interactions/WWDC2014_Session236_Building_Interruptible_and_Responsive_Interactions.md) 636 | - [x] [237 A Strategy for Great Work](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2014/WWDC2014_Session237_A_Strategy_for_Great_Work/WWDC2014_Session237_A_Strategy_for_Great_Work.md) 637 | 638 | ### Services 639 | - [ ] 301 Affiliate Tools for App Developers 640 | - [ ] 302 The New iTunes Connect 641 | - [ ] 303 Optimizing In-App Purchases 642 | - [ ] 304 Creating Great App Previews 643 | - [x] 305 Preventing Unauthorized Purchases with Receipts 644 | - [ ] 306 JavaScript for Automation 645 | 646 | ### Tools 647 | - [ ] 401 What's New in Xcode 6 648 | - [ ] 402 Introduction to Swift 649 | - [ ] 403 Intermediate Swift 650 | - [ ] 404 Advanced Swift 651 | - [ ] 406 Integrating Swift with Objective-C 652 | - [ ] 407 Swift Interoperability In Depth 653 | - [ ] 408 Swift Playgrounds 654 | - [ ] 409 Introduction to LLDB and the Swift REPL 655 | - [ ] 410 Advanced Swift Debugging in LLDB 656 | - [ ] 411 What's New in Interface Builder 657 | - [ ] 412 Localizing with Xcode 6 658 | - [ ] 413 Debugging in Xcode 6 659 | - [ ] 414 Testing in Xcode 6 660 | - [ ] 415 Continuous Integration with Xcode 6 661 | - [x] 416 Building Modern Frameworks 662 | - [ ] 417 What's New in LLVM 663 | - [x] [418 Improving Your App with Instruments](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2014/WWDC2014_Session418_Improving_Your_App_with_Instruments/WWDC2014_Session418_Improving_Your_App_with_Instruments.md) 664 | - [ ] 419 Advanced Graphics and Animations for iOS Apps 665 | 666 | ### Graphics and Games 667 | - [ ] 601 Harnessing the Power of the Mac Pro with OpenGL and OpenCL 668 | - [ ] 602 Ingredients of Great Games 669 | - [ ] 603 Working with Metal: Overview 670 | - [ ] 604 Working with Metal: Fundamentals 671 | - [ ] 605 Working with Metal: Advanced 672 | - [ ] 606 What's New in SpriteKit 673 | - [ ] 608 Best Practices for Building SpriteKit Games 674 | - [ ] 609 What's New in SceneKit 675 | - [ ] 610 Building a Game with SceneKit 676 | - [ ] 611 Designing for Game Controllers 677 | - [ ] 612 Motion Tracking with the Core Motion Framework 678 | 679 | ### Media 680 | - [ ] 501 What's New in Core Audio 681 | - [ ] 502 AVAudioEngine in Practice 682 | - [ ] 503 Mastering Modern Media Playback 683 | - [ ] 504 Advanced Media for the Web 684 | - [ ] 505 Harnessing Metadata in Audiovisual Media 685 | - [ ] 506 Your App, Your Website, and Safari 686 | - [ ] 508 Camera Capture: Manual Controls 687 | - [ ] 509 Creating 3D Interactive Content with WebGL 688 | - [ ] 510 What's New in iAd Workbench 689 | - [ ] 511 Introducing the Photos Frameworks 690 | - [ ] 512 Web Inspector and Modern JavaScript 691 | - [ ] 513 Direct Access to Video Encoding and Decoding 692 | - [ ] 514 Advances in Core Image 693 | - [ ] 515 Developing Core Image Filters for iOS 694 | - [ ] 516 Improving the Accessibility and Usability of Complex Web Applications 695 | - [ ] 517 Designing Responsive Web Experiences 696 | 697 | ### Core OS 698 | - [ ] 701 Designing Accessories for iOS and OS X 699 | - [ ] 702 Managing Apple Devices 700 | - [ ] 703 What's New in the Accelerate Framework 701 | - [ ] 704 Building Apps for Enterprise and Education 702 | - [ ] 705 Distributing Enterprise Apps 703 | - [ ] 706 What's New in Core Location 704 | - [ ] 707 What's New in Foundation Networking 705 | - [ ] 708 Taking Core Location Indoors 706 | - [ ] 709 Cross Platform Nearby Networking 707 | - [ ] 710 Writing Energy Efficient Code, Part 1 708 | - [ ] 711 Keychain and Authentication with Touch ID 709 | - [ ] 712 Writing Energy Efficient Code, Part 2 710 | - [ ] 713 What's New in iOS Notifications 711 | - [ ] 714 Fix Bugs Faster using Activity Tracing 712 | - [ ] 715 User Privacy in iOS and OS X 713 | - [ ] 717 Kids and Apps 714 | - [ ] 718 Adopting AirPrint 715 | 716 | ## WWDC 2013 717 | 718 | ### Special Events 719 | - [ ] 100 Keynote 720 | - [ ] 101 Platforms State of the Union 721 | - [ ] 109 Painting the Future 722 | 723 | ### Frameworks 724 | - [ ] 200 Accessibility in OS X 725 | - [ ] 201 Building User Interfaces for iOS 7 726 | - [ ] 202 Accessibility in iOS 727 | - [ ] 203 What’s New in Cocoa Touch 728 | - [ ] 204 What’s New with Multitasking 729 | - [ ] 205 What’s New in Cocoa 730 | - [ ] 206 Getting Started with UIKit Dynamics 731 | - [ ] 207 What’s New in Core Data and iCloud 732 | - [ ] 208 What’s New in iOS User Interface Design 733 | - [ ] 209 Improving Power Efficiency with App Nap 734 | - [ ] 210 Introducing Text Kit 735 | - [ ] 211 Core Data Performance Optimization and Debugging 736 | - [ ] 213 Best Practices for Cocoa Animation 737 | - [ ] 214 Customizing Your App’s Appearance for iOS 7 738 | - [ ] 215 Optimizing Drawing and Scrolling on OS X 739 | - [ ] 216 Bringing Your iOS Apps to OS X 740 | - [x] [217 Exploring Scroll Views on iOS 7](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2013/WWDC2013_Session217_Exploring_Scroll_Views_in_iOS_7/WWDC2013_Session217_Exploring_Scroll_Views_in_iOS_7.md) 741 | - [ ] 218 Custom Transitions Using View Controllers 742 | - [ ] 219 Making Your App World-Ready 743 | - [ ] 220 Advanced Text Layouts and Effects with Text Kit 744 | - [ ] 221 Advanced Techniques with UIKit Dynamics 745 | - [ ] 222 What’s New in State Restoration 746 | - [ ] 223 Using Fonts with Text Kit 747 | - [x] [224 Designing Code for Performance](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2013/WWDC2013_Session224_Designing_Code_for_Performance/WWDC2013_Session224_Designing_Code_for_Performance.md) 748 | - [ ] 225 Best Practices for Great iOS UI Design 749 | - [x] [226 Implementing Engaging UI on iOS](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2013/WWDC2013_Session226_Implementing_Engaging_UI_on_iOS/WWDC2013_Session226_Implementing_Engaging_UI_on_iOS.md) 750 | - [ ] 227 Solutions to Common Date and Time Challenges 751 | - [ ] 228 Hidden Gems in Cocoa and Cocoa Touch 752 | 753 | ### Services 754 | - [ ] 300 Managing Apple Devices 755 | - [ ] 301 Extending Your Apps for Enterprise and Education Use 756 | - [ ] 302 What’s New in Passbook 757 | - [ ] 303 Integrating Passbook into your Ecosystem 758 | - [ ] 304 What’s New in Map Kit 759 | - [ ] 305 Using Store Kit for In-App Purchases 760 | - [ ] 306 What’s New in iTunes Connect 761 | - [ ] 307 What’s New in Core Location 762 | - [ ] 308 Using Receipts to Protect Your Digital Sales 763 | - [ ] 309 Putting Map Kit in Perspective 764 | - [ ] 310 Harnessing iOS to Create Magic in Your Apps 765 | 766 | ### Tools 767 | - [ ] 400 What’s New in Xcode 5 768 | - [ ] 401 Xcode Core Concepts 769 | - [ ] 402 What’s New in the LLVM Compiler 770 | - [x] 403 From Zero to App Store in Xcode 5 771 | - [ ] 404 Advances in Objective-C 772 | - [ ] 405 Interface Builder Core Concepts 773 | - [ ] 406 Taking Control of Auto Layout in Xcode 5 774 | - [ ] 407 Debugging with Xcode 775 | - [ ] 408 Optimize Your Code Using LLVM 776 | - [ ] 409 Testing in Xcode 5 777 | - [ ] 410 Fixing Memory Issues 778 | - [ ] 412 Continuous Integration with Xcode 5 779 | - [ ] 413 Advanced Debugging with LLDB 780 | - [ ] 414 Understanding Source Control in Xcode 781 | - [ ] 415 Maximizing Apple Development Resources 782 | - [ ] 416 Introducing AppleScript Libraries 783 | - [ ] 417 OS X Automation Update 784 | 785 | ### Graphics and Games 786 | - [ ] 500 What’s New in Scene Kit 787 | - [ ] 501 Integrating with Game Controllers 788 | - [ ] 502 Introduction to Sprite Kit 789 | - [ ] 503 Designing Games with Sprite Kit 790 | - [ ] 504 What’s New in Game Center 791 | - [ ] 505 Advances in OpenGL ES 792 | - [ ] 506 Turn-Based Gaming with Game Center 793 | - [ ] 507 What’s New in OpenGL for OS X 794 | - [ ] 508 Working with OpenCL 795 | - [ ] 509 Core Image Effects and Techniques 796 | 797 | ### Media 798 | - [ ] 600 What’s New in Safari and WebKit for Web Developers 799 | - [ ] 601 Getting to Know Web Inspector 800 | - [ ] 602 What’s New in Core Audio for iOS 801 | - [ ] 603 Getting the Most Out of Web Inspector 802 | - [ ] 604 Introducing iAd Workbench, The Best Way to Market Your App 803 | - [ ] 605 What’s New in iBooks Author 804 | - [ ] 606 Moving to AV Kit and AV Foundation 805 | - [ ] 607 Power and Performance: Optimizing Your Website for Great Battery Life and Responsive Scrolling 806 | - [ ] 608 Preparing and Presenting Media for Accessibility 807 | - [ ] 609 Introduction to iBooks Author Widget and iAd Rich Media Ad Development with iAd Producer 4 808 | - [ ] 610 What’s New in Camera Capture 809 | - [ ] 611 Building Advanced iBooks HTML 5 Widgets and iAd Rich Media Ads 810 | - [ ] 612 Advanced Editing with AV Foundation 811 | - [ ] 613 iAd Integration and Best Practices 812 | - [ ] 614 Implementing OS X Push Notifications for Websites 813 | - [ ] 615 Integrating JavaScript into Native Apps 814 | 815 | ### Core OS 816 | - [ ] 700 Designing Accessories for iOS and OS X 817 | - [ ] 701 Maximizing Battery Life on OS X 818 | - [ ] 702 Efficient Design with XPC 819 | - [ ] 703 Core Bluetooth 820 | - [ ] 704 Building Efficient OS X Apps 821 | - [ ] 705 What’s New in Foundation Networking 822 | - [ ] 707 What’s New in Kext Development 823 | - [ ] 708 Nearby Networking with Multipeer Connectivity 824 | - [ ] 709 Protecting Secrets with the Keychain 825 | - [ ] 710 A Practical Guide to the App Sandbox 826 | - [ ] 711 Advances in AirPrint 827 | - [ ] 712 Energy Best Practices 828 | - [ ] 713 The Accelerate Framework 829 | - [ ] 714 Protecting your Users’ Privacy 830 | 831 | ## WWDC 2012 832 | 833 | ### General 834 | - [ ] 100 Keynote 835 | - [ ] 101 Platforms Kickoff 836 | 837 | ### Essentials 838 | - [ ] 200 What's New in Cocoa Touch 839 | - [ ] 202 Introduction to Auto Layout for iOS and OS X 840 | - [ ] 203 Accessibility for OS X 841 | - [ ] 204 What's New in Cocoa 842 | - [ ] 205 Introducing Collection Views 843 | - [ ] 206 Secure Automation Techniques in OS X 844 | - [ ] 208 Saving and Restoring Application State on iOS 845 | - [ ] 209 iCloud Storage Overview 846 | - [ ] 210 Accessibility for iOS 847 | - [x] [211 Building Concurrent User Interfaces on iOS](https://github.com/antonio081014/WWDC_Learning_Review/WWDC2012/WWDC2012_Session211_Building_Concurrent_User_Interfaces_on_iOS/WWDC2012_Session211_Building_Concurrent_User_Interfaces_on_iOS.md) 848 | - [ ] 212 Basics+Habits: Building Your Software Projects To Last 849 | - [ ] 213 Introduction to High Resolution on OS X 850 | - [ ] 214 Core Data Best Practices 851 | - [ ] 215 Text and Linguistic Analysis 852 | - [ ] 216 Advanced Appearance Customization on iOS 853 | - [ ] 217 Layer-Backed Views: AppKit + Core Animation 854 | - [ ] 218 Using iCloud with UIDocument 855 | - [ ] 219 Advanced Collection Views and Building Custom Layouts 856 | - [ ] 220 Keyboard Input in iOS 857 | - [ ] 221 iOS User Interface Design 858 | - [ ] 222 Introduction to Attributed Strings for iOS 859 | - [ ] 223 Enhancing User Experience with Scroll Views 860 | - [ ] 224 Using iCloud with NSDocument 861 | - [ ] 225 Up and Running: Making a Great Impression with Every Launch 862 | - [ ] 226 Core Text and Fonts 863 | - [ ] 227 Using iCloud with Core Data 864 | - [ ] 228 Best Practices for Mastering Auto Layout 865 | - [ ] 230 Advanced Attributed Strings for iOS 866 | - [ ] 231 What's New with Gestures 867 | - [ ] 232 Auto Layout by Example 868 | - [ ] 233 Building Advanced Gesture Recognizers 869 | - [ ] 234 AirPrint 870 | - [ ] 235 iOS App Performance: Responsiveness 871 | - [ ] 236 The Evolution of View Controllers on iOS 872 | - [ ] 237 Advanced iCloud Document Storage 873 | - [ ] 238 iOS App Performance: Graphics and Animations 874 | - [ ] 240 Polishing Your Interface Rotations 875 | - [ ] 241 Cocoa Interprocess Communication with XPC 876 | - [ ] 242 iOS App Performance: Memory 877 | - [ ] 243 iPhoto for iOS: UI Progression and Animation Design 878 | - [ ] 244 Internationalization Tips and Tricks 879 | - [ ] 245 Advanced Tips and Tricks for High Resolution on OS X 880 | 881 | ### App Services 882 | - [ ] 300 Getting Around Using Map Kit 883 | - [ ] 301 Introducing Passbook, Part 1 884 | - [ ] 302 Selling Products with Store Kit 885 | - [ ] 303 Staying on Track with Location Services 886 | - [ ] 304 Events and Reminders in Event Kit 887 | - [ ] 305 What's New in iTunes Connect for App Developers 888 | - [ ] 306 Integrating With Facebook, Twitter and Sina Weibo 889 | - [ ] 307 Building Great Newsstand Apps 890 | - [ ] 308 Managing Subscriptions with In-App Purchase 891 | - [ ] 309 Introducing Passbook, Part 2 892 | - [ ] 311 Building and Distributing Custom B2B Apps for iOS 893 | 894 | ### Developer Tools 895 | - [ ] 400 Developer Tools Kickoff 896 | - [ ] 402 Working Efficiently with Xcode 897 | - [ ] 404 Building from the Command Line with Xcode 898 | - [ ] 405 Modern Objective-C 899 | - [ ] 406 Adopting Automatic Reference Counting 900 | - [ ] 407 Adopting Storyboards in Your App 901 | - [ ] 408 Working with Schemes and Projects in Xcode 902 | - [ ] 409 Learning Instruments 903 | - [ ] 410 What's New in LLVM 904 | - [ ] 411 Source Control Management in Xcode 905 | - [ ] 412 Debugging in Xcode 906 | - [ ] 413 Migrating to Modern Objective-C 907 | - [ ] 414 Building, Archiving, and Submitting Your App 908 | - [ ] 415 Debugging with LLDB 909 | 910 | ### Graphics, Media & Games 911 | - [ ] 500 Game Technologies Kickoff 912 | - [ ] 501 Publishing with the iBookstore 913 | - [ ] 502 Effective HTTP Live Streaming 914 | - [ ] 503 Building Books with iBooks Author 915 | - [ ] 504 Introducing Scene Kit 916 | - [ ] 505 Audio Session and Multiroute Audio in iOS 917 | - [ ] 506 Optimizing 2D Graphics and Animation Performance 918 | - [ ] 508 What's New in Game Center 919 | - [ ] 509 Building Interactive Books with EPUB 3 and JavaScript 920 | - [ ] 510 Getting Started with Core Image 921 | - [ ] 511 Core Image Techniques 922 | - [ ] 512 What's New in HTTP Live Streaming 923 | - [ ] 513 Advances in OpenGL and OpenGL ES 924 | - [ ] 514 OpenGL ES Tools and Techniques 925 | - [ ] 515 HTML, CSS, and DOM for Book Authors 926 | - [ ] 516 Integrating Your Games with Game Center 927 | - [ ] 517 Real-Time Media Effects and Processing during Playback 928 | - [ ] 518 Improving Accessibility in Books 929 | - [ ] 519 Multiplayer Gaming with Game Center 930 | - [ ] 520 What's New in Camera Capture 931 | - [ ] 521 Building Game Center Games for OS X 932 | - [ ] 522 Adopting OpenCL in Your Application 933 | - [ ] 523 Best Practices for Color Management 934 | - [ ] 524 Understanding Core Motion 935 | 936 | ### Safari & Web 937 | - [ ] 600 Debugging UIWebViews and Websites on iOS 938 | - [ ] 601 Optimizing Web Content in UIWebViews and Websites on iOS 939 | - [ ] 602 Delivering Web Content on High Resolution Displays 940 | - [ ] 603 Tools, Services, and APIs for iTunes Affiliate Program Marketing 941 | - [ ] 604 Advanced Effects with HTML5 Media Technologies 942 | - [ ] 605 Producing Rich Media Advertisements for iAd 943 | 944 | ### Core OS 945 | - [ ] 700 The OS X App Sandbox 946 | - [ ] 701 iOS Accessories 947 | - [ ] 702 Gatekeeper and Developer ID 948 | - [ ] 703 Core Bluetooth 101 949 | - [ ] 704 The Security Framework 950 | - [ ] 705 Advanced Core Bluetooth 951 | - [ ] 706 Networking Best Practices 952 | - [ ] 707 Simplify Networking with Bonjour 953 | - [ ] 708 The Accelerate Framework 954 | - [ ] 709 What's New In The Filesystem 955 | - [ ] 710 Privacy Support in iOS and OS X 956 | - [ ] 711 Power Management 957 | - [ ] 712 Asynchronous Design Patterns with Blocks, GCD, and XPC 958 | - [ ] 714 Protecting the User's Data 959 | 960 | ## WWDC 2011 961 | 962 | ### General 963 | 964 | - [ ] 600 Keynote 965 | - [ ] 601 Apple Platforms Kickoff 966 | 967 | ### App Frameworks 968 | - [ ] 100 What's New in Cocoa Touch 969 | - [ ] 101 What's New in Cocoa 970 | - [ ] 102 Implementing UIViewController Containment 971 | - [ ] 103 Cocoa Autolayout 972 | - [ ] 104 Advanced ScrollView Techniques 973 | - [ ] 105 Polishing your App: Tips and Tricks to Improve Responsiveness and Performance 974 | - [ ] 106 System-wide Previews on OSX and iOS 975 | - [ ] 107 Auto Save and Versions in Mac OS X 10.7 Lion 976 | - [ ] 108 iOS Printing System 977 | - [ ] 109 Taking Advantage of File Coordination 978 | - [ ] 110 Designing User Interfaces for iOS and Mac OS X Apps 979 | - [ ] 111 Visualizing Information Geographically with MapKit 980 | - [ ] 112 Writing Easy-To-Change Code: Your Second-Most Important Goal As A Developer 981 | - [ ] 113 Full Screen and Aqua Changes 982 | - [ ] 114 Customizing the Appearance of UIKit Controls 983 | - [ ] 115 Scrolling, Swiping, Dragging: Now with more animation! 984 | - [ ] 116 Storing Documents in iCloud using iOS 5 985 | - [ ] 117 Performing Calendar Calculations 986 | - [ ] 118 Making the Most of Multi-Touch on iOS 987 | - [ ] 119 Resume and Automatic Termination in Lion 988 | - [ ] 120 View Based NSTableView Basic to Advanced 989 | - [ ] 121 Understanding UIKit Rendering 990 | - [ ] 122 iOS Accessibility 991 | - [ ] 123 Improving the Stability of Your Apps 992 | - [ ] 124 Twitter Integration 993 | - [x] 125 UITableView Changes, Tips & Tricks 994 | - [ ] 127 Design Patterns to Simplify Mac Accessibility 995 | - [ ] 128 Advanced Text Processing 996 | - [ ] 129 Practical Drawing for iOS Developers 997 | - [ ] 131 Getting Your Apps Ready for China and other Hot New Markets 998 | - [ ] 133 Lion-Sized Automation 999 | - [ ] 136 Latent Semantic Mapping: Exposing the Meaning behind Words and Documents 1000 | 1001 | ### Core OS 1002 | 1003 | - [ ] 200 Core OS Networking, Key Principles 1004 | - [ ] 201 Working with iOS Accessories 1005 | - [ ] 202 Security Overview 1006 | - [ ] 203 Introducing App Sandbox 1007 | - [ ] 204 App Sandbox and the Mac App Store 1008 | - [ ] 205 Core OS Networking In-Depth 1009 | - [ ] 206 Introducing XPC 1010 | - [ ] 207 Userland Device Access 1011 | - [ ] 208 Securing Application Data 1012 | - [ ] 209 Inside the Accelerate Framework for iOS 1013 | - [ ] 210 Mastering Grand Central Dispatch 1014 | - [ ] 211 Bonjour Network Discovery and Connectivity 1015 | - [ ] 212 Next Generation Cryptographic Services* 1016 | 1017 | ### Developer Tools 1018 | 1019 | - [ ] 300 Developer Tools Kickoff 1020 | - [ ] 302 Using Interface Builder in Xcode 4 1021 | - [ ] 303 What's New in Core Data on iOS 1022 | - [ ] 306 Maximizing Productivity in Xcode 4 1023 | - [ ] 307 Moving to Apple LLVM compiler 1024 | - [ ] 308 Blocks and Grand Central Dispatch in Practice 1025 | - [ ] 309 Introducing Interface Builder Storyboarding 1026 | - [ ] 310 What's New in Instruments 1027 | - [ ] 311 Mastering Source Control in Xcode 4 1028 | - [ ] 312 iOS Performance and Power Optimization with Instruments 1029 | - [ ] 313 Mastering Schemes in Xcode 4 1030 | - [ ] 315 What's New in Core Data on Mac OS X 1031 | - [ ] 316 LLVM Technologies in Depth 1032 | - [ ] 317 Device Management and App Submission with Xcode 4 1033 | - [ ] 319 Effective Debugging with Xcode 4 1034 | - [ ] 320 Adopting Multitasking in Your App 1035 | - [ ] 321 Migrating from GDB to LLDB 1036 | - [ ] 322 Objective-C Advancements In-Depth 1037 | - [ ] 323 Introducing Automatic Reference Counting 1038 | 1039 | ### Graphics, Media, & Games 1040 | 1041 | - [ ] 400 Graphics, Media, and Games Kickoff 1042 | - [ ] 401 What's New in OpenCL 1043 | - [ ] 402 Essential Game Technologies for iOS, Pt 1 1044 | - [ ] 403 Essential Game Technologies for iOS, Pt 2 1045 | - [ ] 404 Audio Development for Games 1046 | - [ ] 405 Exploring AV Foundation 1047 | - [ ] 406 AirPlay and External Displays in iOS apps 1048 | - [ ] 407 Introduction to Game Center 1049 | - [ ] 408 HTTP Live Streaming Update 1050 | - [ ] 409 Working with Game Center 1051 | - [ ] 410 Multi-Player Gaming with Game Center 1052 | - [ ] 411 Music in iOS and Lion 1053 | - [ ] 412 Turn-Based Gaming with Game Center 1054 | - [ ] 413 Audio Session Management for iOS 1055 | - [ ] 414 Advances in OpenGL ES for iOS 5 1056 | - [ ] 415 Working with Media in AV Foundation 1057 | - [ ] 416 Tools for Tuning OpenGL ES Apps on iOS 1058 | - [ ] 417 Introducing AV Foundation Capture For Lion 1059 | - [ ] 418 Best Practices for OpenGL ES Apps in iOS 1060 | - [ ] 419 Capturing from the Camera using AV Foundation on iOS 5 1061 | - [ ] 420 Advances in OpenGL for Mac OS X Lion 1062 | - [ ] 421 Core Animation Essentials 1063 | - [ ] 422 Using Core Image on iOS & Mac OS X 1064 | - [ ] 423 What's New in Core Motion 1065 | 1066 | ### Internet & Web 1067 | 1068 | - [ ] 500 What's New in Core Location 1069 | - [ ] 501 iCloud Storage Overview 1070 | - [ ] 502 Advanced HTML5 Media Controllers in Safari 1071 | - [ ] 503 Hidden Gems for Web Apps 1072 | - [ ] 504 Building Newsstand Apps 1073 | - [ ] 505 iAd Implementation Best Practices 1074 | - [ ] 506 Building iAd Rich Media Ads with iAd Producer 1075 | - [ ] 507 iBooks: Create Beautiful Books with HTML5, CSS3 and EPUB 1076 | - [ ] 508 Understanding And Optimizing Web Graphics 1077 | - [ ] 509 What's New in CSS Effects and Animations 1078 | - [ ] 510 In-App Purchase for iOS and Mac OS X 1079 | - [ ] 511 Rich Text Editing in Safari on iOS 1080 | - [ ] 512 What's New in App Publishing With iTunes Connect 1081 | - [ ] 514 What's New in Safari Extensions 1082 | - [ ] 515 Using HTML5 Offline Storage 1083 | - [ ] 516 Understanding Layout and Gestures in Safari on iOS and Lion 1084 | - [ ] 517 Using Local And Push Notifications on iOS and Mac OS X 1085 | - [ ] 518 Testing Your Location-Aware App Without Leaving Your Chair 1086 | - [ ] 519 Combining Web Accessibility and Automation on iOS 1087 | 1088 | # Tech Talks 1089 | - [x] 803 Designing for Subscription Success 1090 | 1091 | # App Store Connect 1092 | - [x] 101 TestFlight 1093 | - [x] 102 App Analytics Overview 1094 | - [x] 103 App Analytics Metrics 1095 | - [x] 104 App Analytics Retention 1096 | - [x] 105 App Store Connect Basics 1097 | 1098 | - [x] 10869 Family Sharing for in-app purchases 1099 | 1100 | # Tech Talks 1101 | - [x] [Tips for preveneting common review issues](https://developer.apple.com/videos/play/tech-talks/10885) 1102 | - [x] [Explore UI animation hitches and the render loop](https://developer.apple.com/videos/play/tech-talks/10855) 1103 | 1104 | # License 1105 | [MIT](https://github.com/antonio081014/WWDC_Learning_Review/blob/master/LICENSE) 1106 | -------------------------------------------------------------------------------- /WWDC2012/WWDC2012_Session211_Building_Concurrent_User_Interfaces_on_iOS/WWDC2012_Session211_Building_Concurrent_User_Interfaces_on_iOS.md: -------------------------------------------------------------------------------- 1 | In this session, Andy presents how to implement the following 3 features to make app UI more concurrent. 2 | 3 | - **Concurrent Processing of Data intended using UI** 4 | - **Concurrent Drawing for UI Graphics** 5 | - **Canceling Concurrent Operations** 6 | 7 | Bonus Part: present how to use Xcode Instrument Profile to identify the Problems. 8 | 9 | ### **1. Concurrent Processing of Data intended using UI** 10 | ![Data Flow Overview](p1.png) 11 | ``` 12 | //1st, System events on the main queue 13 | NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 14 | //2nd, Separate expensive processing with NSOperationQueue 15 | [queue setName:@”Data Processing Queue”]; 16 | [queue addOperationWithBlock:^{ processStock(someStock); }]; 17 | [queue addOperationWithBlock:^{ 18 | //3rd, Update data UIKit accesses on the main queue 19 | [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 20 | updateUI(someStock); 21 | }]; }]; 22 | ``` 23 | ![Step 1 & 2](p2.png) 24 | ![Step 3](p3.png) 25 | ### **2. Concurrent Drawing for UI Graphics** 26 | - UIKit calls ``-drawRect:`` on the main queue 27 | - You can draw an image for your view on another queue 28 | ``` 29 | - (UIImage *)renderInImageOfSize:(CGSize)size { 30 | UIGraphicsBeginImageContextWithOptions(size, NO, 0); 31 | [[UIColor greenColor] set]; 32 | UIRectFill([self bounds]); 33 | [anImage drawAtPoint:CGPointZero]; 34 | UIImage *i = UIGraphicsGetImageFromCurrentImageContext(); 35 | UIGraphicsEndImageContext(); 36 | return i; 37 | } 38 | ``` 39 | - Drawing APIs are safe to use from any queue 40 | - if they begin and end in the same operation! 41 | - Must call ``-[UIImageView setImage:]`` on the main queue 42 | 43 | ### **3. Canceling Concurrent Operations** 44 | Cancel Operation is necessary when user does not need operation to be done anymore, it is reasonable to cancel it before it took too much computing power of battery. 45 | 46 | One way to cancel operations is calling: ``-[NSOperationQueue cancelAllOperations]``, but canceling all the operations is not always the case. So, The other way is ``[operation cancel]``. In the demo, Andy created an `NSDictionary` to keep the operation for each renderer. When user screen in, then add corresponding operations, while if the user screen out, remove it from the `NSDictionary` and cancel it. 47 | ``` 48 | // 1st, Creating an NSOperationQueue 49 | NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 50 | // 2nd, Creating an NSOperation concrete class object. 51 | // NSBlockOperation is a subclass of NSOperation(abstract class) 52 | NSBlockOperation *op = [[NSBlockOperation alloc] init]; 53 | // 3rd, Create Weak Reference to the operation 54 | __weak NSBlockOperation *weakOp = op; 55 | // 4th, Adding work to the operation. 56 | [op addExecutionBlock:^{ 57 | for (int i = 0; i < 10000; i++) { 58 | // 5th, for each step, check if operation is canceled. 59 | if ([weakOp isCancelled]) break; 60 | processData(data[i]); 61 | } 62 | }]; 63 | // 6th, Add the operation to the queue. 64 | [queue addOperation:op]; 65 | ``` 66 | It's important to avoid retain strong reference cycle, by using a weak reference to the operation and used in the operation block. 67 | ![Step 3, Weak Reference to the operation](p4.png) 68 | -------------------------------------------------------------------------------- /WWDC2012/WWDC2012_Session211_Building_Concurrent_User_Interfaces_on_iOS/p1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2012/WWDC2012_Session211_Building_Concurrent_User_Interfaces_on_iOS/p1.png -------------------------------------------------------------------------------- /WWDC2012/WWDC2012_Session211_Building_Concurrent_User_Interfaces_on_iOS/p2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2012/WWDC2012_Session211_Building_Concurrent_User_Interfaces_on_iOS/p2.png -------------------------------------------------------------------------------- /WWDC2012/WWDC2012_Session211_Building_Concurrent_User_Interfaces_on_iOS/p3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2012/WWDC2012_Session211_Building_Concurrent_User_Interfaces_on_iOS/p3.png -------------------------------------------------------------------------------- /WWDC2012/WWDC2012_Session211_Building_Concurrent_User_Interfaces_on_iOS/p4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2012/WWDC2012_Session211_Building_Concurrent_User_Interfaces_on_iOS/p4.png -------------------------------------------------------------------------------- /WWDC2012/WWDC2012_Session211_Building_Concurrent_User_Interfaces_on_iOS/px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2012/WWDC2012_Session211_Building_Concurrent_User_Interfaces_on_iOS/px.png -------------------------------------------------------------------------------- /WWDC2013/WWDC2013_Session217_Exploring_Scroll_Views_in_iOS_7/WWDC2013_Session217_Exploring_Scroll_Views_in_iOS_7.md: -------------------------------------------------------------------------------- 1 | # WWDC 2013 Session 217 Exploring Scroll Views in iOS 7 2 | 3 | ## Nested Scroll Views 4 | 5 | At first, the session presents how to make nested scroll views working together by using a `UICollectionView` in `UIScrollView`, while each `UICollectionViewCell` has a `UIScrollView` as the subview. 6 | Meanwhile, the `UICollectionView` is the subclass of `UIScrollView`. 7 | 8 | ``` 9 | - (void)scrollViewDidScroll:(UIScrollView *)scrollView { 10 | determine delta beyond catch point 11 | adjust parent contentOffset by delta 12 | translate child by delta 13 | } 14 | ``` 15 | Key points in this part: 16 | - When subview scroll, using a delegate call to scroll parent scrollview(set contentOffset). 17 | - When subview scroll, avoiding double scroll by transforming itself, transform itself back when scroll ends. 18 | - When `scrollViewWillEndDragging`, adjust scrollview contentOffset change ratio between sub-scrollview and parent-scrollview. 19 | 20 | The demo code has been published in the [1st release](https://github.com/antonio081014/Demo2013/releases/tag/V1.0) 21 | 22 | ## Scrolling with UIKit Dynamics 23 | 24 | In the second part, the session presents how to add special animation effect in the `UICollectionView` by customizing `UICollectionFlowLayout` with adding `UIDynamicBehavior` to `UICollectionViewLayoutAttributes`. 25 | 26 | - Subclass UICollectionViewFlowLayout 27 | - Create UIDynamicAnimator 28 | - Create UIAttachmentBehavior for each item 29 | - Stretch the attachments when scrolling 30 | 31 | ``` 32 | - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds { 33 | CGFloat delta = newBounds.origin.y - self.collectionView.bounds.origin.y 34 | shift layout attribute positions by delta 35 | notify UIDynamicAnimator 36 | } 37 | ``` 38 | The demo code has been published in the [2nd release](https://github.com/antonio081014/Demo2013/releases/tag/V2.0) 39 | 40 | Hope someone could help me make a gif file and add it here for the better demo purpose. 41 | 42 | ## Version 3: Memory Efficient Code 43 | 44 | In the previous version, when prepareLayout is called, all the behaviors of every cells will be created, initialized and attached to the cell. In this version, the behaviors will be added to the cell when the cell appear on the screen, be removed when the cell disappear from the screen, very effiecient. 45 | [The release code could be found here](https://github.com/antonio081014/Demo2013/releases/tag/V3.0). 46 | -------------------------------------------------------------------------------- /WWDC2013/WWDC2013_Session226_Implementing_ Engaging_UI_on_iOS/WWDC2013_Session226_Implementing_ Engaging_UI_on_iOS.md: -------------------------------------------------------------------------------- 1 | # WWDC2013 Session 226 Implementing Engaging UI on iOS 2 | 3 | ## Custom UIViewController transitions 4 | - Create and Initialize new UIViewController 5 | - Set `transitioningDelegate` to be `self` 6 | - Set `modalPresentationStyle` to be `UIModalPresentationCustom` 7 | - Call `- presentViewController:animated:completion:` 8 | - In this UIViewController, conforms to `UIViewControllerTransitioningDelegate` 9 | - Implement `- (id ) animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source` delegate method. In this method, we could totally customize the return object which conforms to `UIViewControllerAnimatedTransitioning`. This delegate method give custom transition when trying to present a new `UIViewController`. 10 | - Implement `- (id )animationControllerForDismissedController:(UIViewController *)dismissed`, In this method, we could also totally customize the return object which conforms to `UIViewControllerAnimatedTransitioning`. This delegate method give custom transition when trying to dismiss a presented `UIViewController`. 11 | - Create a custom subclass of NSObject conforms to `UIViewControllerAnimatedTransitioning`, override several required methods, then magic happens. 12 | 13 | ## App-wide appearance 14 | `UIAppearance` is very useful `Protocol` in iOS system. Developer could use this protocol to customize all the UIView or UIControl in one action. 15 | Example is like: `[[UIButton appearance] setTintColor:[UIColor redColor]]` 16 | 17 | ## Resizable and template images 18 | `- [UIImage resizableImageWithCapInsets:]` 19 | 20 | ## UIKit Dynamics 21 | The basics 22 | ``` 23 | animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; 24 | 25 | gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[itemToAnimate]]; 26 | 27 | [animator addBehavior:gravityBehavior]; 28 | ``` 29 | ## UIMotionEffect -------------------------------------------------------------------------------- /WWDC2013/WWDC2013_Session_224_Designing_Code_for_Performance/WWDC2013_Session_224_Designing_Code_for_Performance.md: -------------------------------------------------------------------------------- 1 | In this session, Quinn presents how to use right Data Structures to improve the app performance as much as possible. 2 | 3 | ## 1. When to focus on performance 4 | ![Steve Quote 1](p1.png) 5 | ![Steve Quote 2](p2.png) 6 | Trying to improve the parts consume more execution time. 7 | 8 | - **Premature optimization** leads to unnecessary complexity 9 | - “If it ain’t broke, don’t fix it.” 10 | - Use Instruments to focus on bottlenecks 11 | - **Informed design** leads to elegant, efficient code 12 | - Consider performance during design 13 | - Intelligently avoid real performance pitfalls 14 | - Why design in slowness you can easily avoid? 15 | 16 | 17 | ## 2. How to evaluate computational complexity 18 | This part Quinn present Big-O notation, which presents the computational complexity of an Algorithm, or Operation. 19 | Example Here: 20 | `[NSArray -containsObject:]` vs `[NSSet -containsObject:]` 21 | 22 | - `[NSArray -containsObject:]` sends `-isEqual:` to each objects in the array, which will take O(N). 23 | - `[NSSet -containsObject:]` takes O(1) instead, because `NSSet` is a Hash-Based Organization, which trying the best to have all the objects uniform distributed. 24 | 25 | `NSObject`'s `-isEqual:` and `-hash` are functionally equivalent to: 26 | ``` 27 | - (BOOL) isEqual:(id)other { 28 | return self == other; 29 | } 30 | - (NSUInteger) hash { 31 | return (NSUInteger)self; 32 | } 33 | ``` 34 | To Identify the Custom NSObject Subclass object, at least `-isEqual:` and `-hash` needs to be implemented in the subclass. The better `-hash` function implemented, the better performance will be retrieved for searching/identifying involved operations. 35 | ``` 36 | @interface WWDCNews : NSObject 37 | @property (readonly, copy) NSString *title; 38 | @property (readonly, copy) NSDate *timestamp; 39 | @end 40 | @implementation WWDCNews 41 | - (NSUInteger) hash { 42 | return [self.title hash]; 43 | } 44 | - (BOOL) isEqual:(id)object { 45 | return ([object isKindOfClass:[WWDCNews class]] 46 | && [self.title isEqual:[object title]] 47 | && [self.timestamp isEqual:[object timestamp]]); 48 | } 49 | @end 50 | ``` 51 | ## 3. How to choose and use data structures 52 | - Plan for scale when appropriate 53 | - All data structures have tradeoffs 54 | - A bad fit hurts performance 55 | - The wrong tool 56 | - The wrong approach 57 | 58 | - Immutable vs Mutable 59 | - Immutable provides 60 | - Thread Safety 61 | - Memory and Speed Optimization 62 | - `NSArray` / `NSMutableArray` 63 | - Ordered, indexed, allows duplicates 64 | - Fast operations 65 | - Indexed access (e.g. `-objectAtIndex:`, `-firstObject`, `-lastObject`) 66 | - Add / remove at either end (e.g. `-addObject:`, `-removeLastObject:`) 67 | - Slower operations 68 | - Search (e.g. `-containsObject:`, `-indexOfObject:`, `-removeObject:`) 69 | - Add / remove, arbitrary index (e.g. `-insertObject:atIndex:`) 70 | - Specialty operations 71 | - Binary search (requires a sorted range of an array) 72 | - `-indexOfObject:inSortedRange:options:usingComparator:` 73 | - `NSSet` / `NSMutableSet` 74 | - Unordered, no duplicates, hash lookup 75 | - Add, remove, and search are fast 76 | - (e.g. `-addObject:`, `-removeObject:`, `-containsObject:`) 77 | - Specialty operations 78 | - Set math: test overlap (e.g. `-intersectsSet:`, `-isSubsetOfSet:`) 79 | - Set math: modify (e.g. `-intersectSet:`, `-minusSet:`, `-unionSet:`) 80 | - Caveats 81 | - Converting array to set loses ordering and duplicates 82 | - Cannot be stored in a property list or JSON 83 | - `NSCountedSet` 84 | - Unordered, no duplicates, hash lookup 85 | - Subclass of `NSMutableSet`, same operations and caveats 86 | - Tracks net insertion count for each object 87 | - Incremented on insert, decremented on remove 88 | - `-countForObject:` returns individual count 89 | - `-count` still returns number of objects, not sum of insertions 90 | - `NSDictionary` / `NSMutableDictionary` 91 | - Unordered, key-value entries, unique keys, hash lookup 92 | - Add, remove, and search are fast 93 | - (e.g. `-objectForKey:`, `-setObject:forKey:`, `-removeObjectForKey:`) 94 | - Specialty operations 95 | - Property list file I/O 96 | - `+sharedKeySetForKeys:`, `+dictionaryWithSharedKeySet:` (10.8, iOS 6) 97 | - Caveats 98 | - Keys must conform to `NSCopying` (“copy in”) 99 | - NEVER mutate an object that is a dictionary key 100 | - `NSOrderedSet` / `NSMutableOrderedSet` 101 | - Ordered, no duplicates, index / hash lookup (10.7, iOS 5) 102 | - Effectively a cross of `NSArray` and `NSSet` 103 | - Not a subclass of either one 104 | - Call `-array` or `-set` for immutable, live-updating representations 105 | - Caveats 106 | - Increased memory usage 107 | - Property list support requires conversions 108 | - `NSIndexSet` / `NSMutableIndexSet` 109 | - Collection of unique `NSUInteger` values 110 | - Reference a subset of objects in `NSArray` 111 | - Avoid memory overhead of array copies 112 | - Efficient storage and coalescing 113 | - Set arithmetic (intersect, subset, difference) 114 | - Caveats 115 | - Use caution with indexes for mutable arrays 116 | - `NSMapTable` / `NSHashTable` 117 | - Similar to `NSMutableDictionary` / `NSMutableSet` 118 | - More flexibility via `NSMapTableOptions` / `NSHashTableOptions` 119 | - May use pointer identity for equality and hashing 120 | - May contain any pointer (not just objects) 121 | - Optional weak references to keys and/or values (zeroing under ARC) 122 | - Optional copy on insert 123 | - Caveats 124 | - Can’t convert non-object contents to dictionary/set 125 | - Beware of premature optimization! 126 | - `NSCache` 127 | - Similar to `NSMutableDictionary` 128 | - Thread-safe 129 | - Doesn’t copy keys 130 | - Auto-removal under memory pressure 131 | - Ideal for objects that can be regenerated on demand 132 | 133 | ## 4. How to design your code for performance 134 | 135 | ## Summary 136 | - Complexity kills large-scale performance 137 | - Know how much work your code does 138 | - Avoid redundancy, strive for efficiency 139 | - Focus on biggest performance wins 140 | - Profile and analyze, don’t assume 141 | - Prefer built-in collections and API 142 | - Design according to your needs 143 | - Think about performance early -------------------------------------------------------------------------------- /WWDC2013/WWDC2013_Session_224_Designing_Code_for_Performance/p1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2013/WWDC2013_Session_224_Designing_Code_for_Performance/p1.png -------------------------------------------------------------------------------- /WWDC2013/WWDC2013_Session_224_Designing_Code_for_Performance/p2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2013/WWDC2013_Session_224_Designing_Code_for_Performance/p2.png -------------------------------------------------------------------------------- /WWDC2014/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2014/.DS_Store -------------------------------------------------------------------------------- /WWDC2014/WWDC2014_Session221_Creating_Custom_iOS_User_Interface/WWDC2014_Session221_Creating_Custom_iOS_User_Interface.md: -------------------------------------------------------------------------------- 1 | ###In this Session, four main topics are covered. 2 | ## 1. **Spring animations** 3 | Spring Animation is the base of almost every animation in the iOS8 system, which means almost all of the animations in iOS8 are using spring animation. It was introduced from iOS7 via [one single function](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/index.html#//apple_ref/occ/clm/UIView/animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:): 4 | ``` 5 | +animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion: 6 | ``` 7 | 8 | This function is very similar with ordinary animation function we used to using a lot. The only difference here is two additional parameters: Damping Ratio and Initial Spring Velocity. The damping ratio defines how much the oscillation oscillate at the end state of the animation, ranging from 0.0 to 1.0. 0.0 defines high frequency oscillation, while 1.0 defines no oscillation at all. This is place where can help us make a bouncing effect. The initial spring velocity defines how fast the animation starts. The smaller the volecity is, the sooner the animation object will move to the end state, verse vice. 9 | 10 | The following demo code imitate the Animation of Opening Folder on iOS Home Screen. 11 | ``` 12 | const static CGFloat BOXSIZE = 100.f; 13 | - (void)tapped:(UITapGestureRecognizer *)gesture 14 | { 15 | [self initBox]; 16 | [UIView animateWithDuration:1.f 17 | delay:0.f 18 | usingSpringWithDamping:.75f 19 | initialSpringVelocity:.5f 20 | options:0 21 | animations:^{ 22 | [self endBox]; 23 | } completion:^(BOOL finished) { 24 | // 25 | }]; 26 | } 27 | 28 | - (void)initBox 29 | { 30 | self.movingBox.frame = CGRectMake(0.f, self.view.bounds.size.height - BOXSIZE, BOXSIZE, BOXSIZE); 31 | } 32 | 33 | - (void)endBox 34 | { 35 | self.movingBox.frame = CGRectMake(CGRectGetMidX(self.view.bounds) - BOXSIZE * 3.f / 2.f, CGRectGetMidY(self.view.bounds) - BOXSIZE * 3.f / 2.f, BOXSIZE * 3.f, BOXSIZE * 3.f); 36 | } 37 | ``` 38 | ## 2. **Vibrancy and blur** 39 | In iOS8, [`UIBlurEffect`](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIBlurEffect_Ref/index.html#//apple_ref/occ/cl/UIBlurEffect) and [`UIVibrancyEffect`](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIVibrancyEffect/index.html#//apple_ref/occ/cl/UIVibrancyEffect) are introduced for developers have Dynamic Blur Effect more easily. In the talk, Apple Engineer still recommends using static blur effect code if dynamic blur effect views are not actually what you need, since dynamic blur effect takes a lot of computing power. 40 | 41 | The `UIBlurEffect` gives blur effect to an associated `UIView`, while UIVibrancyEffect gives the clear part which is not blurred on the blurred view. So, this is a three layer structure. `UIView` at the bottom, then comes the `UIBlurEffect`, at last the UIVibrancyEffect comes. The UIVibrancyEffect consumes the computing power most. The `UIBlurEffect` gives three styles for the developer to use, `UIBlurEffectStyleExtraLight`, `UIBlurEffectStyleLight`, `UIBlurEffectStyleDark`. 42 | 43 | The example could be found at Siri User Interface, where user could clearly see the app icons on the Home Screen of the iPhone. 44 | 45 | ## 3. **Shape layers** 46 | In this section, the engineer talks about the CAShapeLayer. Several things should be mentioned here: 47 | 48 | How to use CAShapeLayer back up the `UIView` as the base layer. In `UIView` subclass, 49 | ``` 50 | + (Class)layerClass { 51 | return [CAShapeLayer Class]; 52 | } 53 | 54 | - (void)awakeFromNib { 55 | CAShapeLayer *layer = (CAShapeLayer *)self.layer; 56 | // init layer properties here. 57 | // Also, everytime to update layer property, convert it to CAShaperLayer and use a local variable for it. 58 | } 59 | ``` 60 | How to draw part of the path for CAShapeLayer, by setting strokeStart and strokeEnd. 61 | ## 4. **Dyanmic Core Animation behaviors** 62 | This is probably the most challenging part for me, so many sample code on [`CABasicAnimation`](https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CABasicAnimation_class/index.html). I think have a good use of [`CAAction`](https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CAAction_protocol/index.html) Protocol and [`CALayerDelegate`](https://developer.apple.com/library/ios/documentation/QuartzCore/Reference/CALayerDelegate_protocol/) method could greatly help your custom `UIView` subclass have great animation effect when `UIView`’s properties are changed. Also, developer could define customized property, which could be very powerful. By using this technique, developer could not only customize animation behavior, but also disable system’s default animation behaviors. 63 | 64 | Here is a simple piece of demo: 65 | ``` 66 | // 67 | // CustomAnimationView.m 68 | // Sample 69 | // 70 | // Created by Antonio081014 on 8/9/15. 71 | // Copyright (c) 2015 antonio081014.com. All rights reserved. 72 | // 73 | 74 | #import "CustomAnimationView.h" 75 | 76 | @interface CustomAnimationAction : NSObject 77 | @end 78 | 79 | @implementation CustomAnimationAction 80 | 81 | - (void)runActionForKey:(NSString *)event object:(id)anObject arguments:(NSDictionary *)dict 82 | { 83 | if ([event isEqualToString:@"opacity"]) { 84 | CALayer *layer = (CALayer *)anObject; 85 | CFTimeInterval duration = .75; 86 | 87 | CABasicAnimation *bgAnimation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"]; 88 | bgAnimation.duration = duration; 89 | bgAnimation.fromValue = (id)[layer.presentationLayer backgroundColor]; 90 | bgAnimation.toValue = (id)([UIColor colorWithHue:layer.opacity saturation:1.f brightness:1.f alpha:1.f].CGColor); 91 | bgAnimation.fillMode = kCAFillModeForwards; 92 | bgAnimation.removedOnCompletion = NO; 93 | [layer addAnimation:bgAnimation forKey:@"bgColorAnim"]; 94 | 95 | CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"]; 96 | animation.duration = duration; 97 | animation.fromValue = @([layer.presentationLayer opacity]); 98 | animation.toValue = @(layer.opacity); 99 | animation.removedOnCompletion = NO; 100 | [layer addAnimation:animation forKey:@"customKey"]; 101 | } 102 | } 103 | 104 | @end 105 | 106 | @implementation CustomAnimationView 107 | 108 | + (Class)layerClass 109 | { 110 | return [CAShapeLayer class]; 111 | } 112 | 113 | - (void)awakeFromNib 114 | { 115 | [self setup]; 116 | } 117 | 118 | - (instancetype)initWithFrame:(CGRect)frame 119 | { 120 | if (self = [super initWithFrame:frame]) { 121 | [self setup]; 122 | } 123 | return self; 124 | } 125 | 126 | - (void)setup 127 | { 128 | CAShapeLayer *layer = (CAShapeLayer *)self.layer; 129 | 130 | UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.bounds]; 131 | 132 | [layer setPath:path.CGPath]; 133 | [layer setStrokeColor:[UIColor purpleColor].CGColor]; 134 | [layer setLineWidth:6]; 135 | [layer setFillColor:nil]; 136 | [layer setLineCap:kCALineCapRound]; 137 | [layer setLineJoin:kCALineJoinBevel]; 138 | 139 | UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)]; 140 | [self addGestureRecognizer:gesture]; 141 | } 142 | 143 | - (void)tapped:(UITapGestureRecognizer *)gesture 144 | { 145 | [UIView animateWithDuration:1.0 animations:^{ 146 | // CGFloat dx = arc4random() % 100 - 50; 147 | // CGFloat dy = arc4random() % 100 - 50; 148 | // CGFloat x = self.frame.origin.x + dx; 149 | // CGFloat y = self.frame.origin.y + dy; 150 | // self.frame = CGRectMake(x, y, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds)); 151 | [self setAlpha:(CGFloat)(arc4random() % 10) / 10.f]; 152 | }]; 153 | } 154 | 155 | - (id)actionForLayer:(CALayer *)layer 156 | forKey:(NSString *)key 157 | { 158 | if ([key isEqualToString:@"opacity"]) { 159 | return [[CustomAnimationAction alloc] init]; 160 | } 161 | return [super actionForLayer:layer forKey:key]; 162 | } 163 | 164 | @end 165 | 166 | ``` 167 | **Worth to mention** here: when Custom View's frame origin changed, the Key for the change will be **"Position"**, rather than **"Frame"**. This is because `UIView` is backed by `CALayer`, where essentially all the animations added to. My guess would be: any animation of changing property of `UIView` will be "mirrored" to some action of changing property of `CALayer`. 168 | 169 | For more information, here is a link to the [Apple Developer Official Page](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide/ReactingtoLayerChanges/ReactingtoLayerChanges.html). 170 | 171 | 172 | ---------- 173 | -------------------------------------------------------------------------------- /WWDC2014/WWDC2014_Session224_Core_iOS_Application_Architectural_Patterns/WWDC2014_Session224_Core_iOS_Application_Architectural_Patterns.md: -------------------------------------------------------------------------------- 1 | ## 1. Common Patterns 2 | #### Target / Action 3 | **What does it do**: Connect controls to custom logic 4 | **Control** sends messages (**Action**) to the Object(**Target**) 5 | ![Graphic Demo](p1.png) 6 | #### Responder Chain 7 | **What does it do**: Handle events without knowledge of which object will be used 8 | ![Graphic Demo](p2.png) 9 | If the 1st Responder doesn't respond, the message will keep passing until either some responder respond it or nothing happens(no responder). 10 | ![Graphic Demo](p3.png) 11 | #### Composite 12 | **What does it do**: Manipulate a group of objects as a single object 13 | One great example is a parent view could have some subviews. When the parent view is moved or rotated, the subviews follows, be moved or rotated as well. 14 | #### Delegation 15 | **What does it do**: Customize behavior without subclassing 16 | This pattern has been wildly used in a lot of places, e.g, `UITableViewDelegate`, `UITextFieldDelegate`, etc. 17 | It simply tells the delegator some behavior has been operated. The more delegate methods provide, the more flexible and more informative it will be. 18 | #### Data Source 19 | **What does it do**: Customize data retrieval without subclassing 20 | This pattern has also been used in a lot of places, e.g, `UICollectionViewDataSource`, etc. 21 | It gives developer a way to reuse the same **View** for different **Controllers** with different purposes. 22 | #### Model-View-Controller(**MVC**) 23 | **What does it do**: Provide organizational structure to focus responsibilities 24 | **What they are**: 25 | - **Model**: It's the data. 26 | - **View**: It's the thing displays the information to the user, it takes user action/control and turns them to the state changes. 27 | - **Controller**: It takes data from Model and display it on the View, takes user's interaction in the View and turn it to state changes, then update it in the Model accordingly. 28 | 29 | Other patterns could be mentioned here is: **Singleton Pattern**, **Facade Design Pattern**, etc. 30 | 31 | ## 2. Use them in Your Code 32 | 33 | To build an Application, to design(overview, or conceptualize) the app: 34 | 1. Finding out the Definition of Application, and make it into the statement. 35 | 36 | 2. From the definition, extract the data model from all the nouns, and build the relationship from verbs used in this statement. There might be some potential relationship or assistant data model needed for the app, but core data model should be visualized easily from this definition statement. 37 | 38 | 3. View, displays the information model provides. Using composite pattern to structure efficient information and display to the user. Having a View Hierarchy will be very helpful to know which view component presents which part of information model provides. 39 | 40 | 4. In controller, using Data Source pattern if the view could be used in not just one place. and using Delegate to receive message when action has been taken on View. If there is any state change after the user interaction, the controller should update the model accordingly. 41 | 42 | 5. If several controllers use the same piece of code for the similar purpose, it's great to separate it out, and make a new class, so all the controllers who need it could use it without duplicate codes everywhere. (This applies to most of the **Communications**, e.g. Network, Bluetooth, etc.) Sometime, this is called refactor when taking out of the common part. Another great example is implementing **In-App-Purchase**, I have a singleton class to do all of the IAP things, so no two purchase operations could be made at the same time. Sure delegate methods are used here to send information back when user purchases successfully or failed, it would be great practice to let the user know the state of each interaction. 43 | 44 | 6. It's worthy to mention Facade Design Pattern, which could be used in Networking API class. Most of the apps need network communication with the backend, at first, the company is using like Parse.com backing service to provide all the information. So the most of its communication api will be Parse related APIs. While, as the company's user grow fast, using 3rd party service would not be a great if it's more expensive than having some one build your own. So, the code will be changed to adopt the new backing service(your own). Here is the thing, when a Facade Design Pattern used here, all the communications are wrapped in simple self-defined APIs, when backing service changed, the only thing to change is the implementation of Communication APIs, while the Design and Definition of the APIs would not be changed, so the caller (controllers) would not worry about changing code to adopting the new service. This is a great way to separate your code with direct communication APIs. -------------------------------------------------------------------------------- /WWDC2014/WWDC2014_Session224_Core_iOS_Application_Architectural_Patterns/p1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2014/WWDC2014_Session224_Core_iOS_Application_Architectural_Patterns/p1.png -------------------------------------------------------------------------------- /WWDC2014/WWDC2014_Session224_Core_iOS_Application_Architectural_Patterns/p2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2014/WWDC2014_Session224_Core_iOS_Application_Architectural_Patterns/p2.png -------------------------------------------------------------------------------- /WWDC2014/WWDC2014_Session224_Core_iOS_Application_Architectural_Patterns/p3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2014/WWDC2014_Session224_Core_iOS_Application_Architectural_Patterns/p3.png -------------------------------------------------------------------------------- /WWDC2014/WWDC2014_Session235_Advanced_Scrollviews_and_Touch_Handling_Techniques/WWDC2014_Session235_Advanced_Scrollviews_and_Touch_Handling_Techniques.md: -------------------------------------------------------------------------------- 1 | # WWDC2014 Session 235 Advanced Scrollviews and Touch Handling Techniques 2 | 3 | This is one of the very technique session in WWDC 2014. I have made a duplicate demo from this session and published it [here](https://github.com/antonio081014/TouchDemo). 4 | 5 | Here is a list of problems and solutions from the talk. 6 | 7 | - When `UIScrollView` with DrawerView (`UIVisuallEffectView`) added to controller's view(AView), AView's user interaction is blocked. How to keep AView unblocked from user? 8 | > Set `UIScrollView`'s [`userInteractionEnabled`](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/index.html#//apple_ref/occ/instp/UIView/userInteractionEnabled) to be `NO`. 9 | 10 | - When `UIScrollView`'s userInteractionEnabled is false, how can we keep `UIScrollView`'s `panGestureRecognizer`, so the `UIScrollView` could be pulled up or down. 11 | > Easy solution would be pass the UIScrollView's property [`panGestureRecognizer`](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIScrollView_Class/#//apple_ref/occ/instp/UIScrollView/panGestureRecognizer) to its superview, so the superview could recognize the pan gesture, while not being blocked. 12 | 13 | - How to add subviews to `UIVisualEffectView`? 14 | > Since `UIVisualEffectView` would do tons of work for the blurring effect on the view, it's best to add any subview to its `contentView`, which is a `UIView` on top of it. Then these subviews would not interfere with the computation of visual effect. 15 | 16 | - How does `- hitTest:withEvent:` work? 17 | > This function is defined in `UIView`, the following is the pseudo code. 18 | > ``` 19 | > - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 20 | if (/* point is in our bounds */) { 21 | for (/* each subview, in reverse order */) { 22 | UIView *hitView = /* recursive call on subview */ 23 | if (hitView != nil) { 24 | return hitView; 25 | } 26 | } 27 | return self; 28 | } 29 | return nil; 30 | } 31 | > ``` 32 | 33 | - How to reenable user interaction on `UIScrollView` without blocking its parent view? 34 | > 1. Set `UIScrollView`'s `userInteractionEnabled` to `YES`. 35 | > 2. Subclass `UIScrollView`, override `- hitTest:withEvent:` function, so this function either returns `UIScrollView`'s subview, or its superview, rather itself. 36 | 37 | > ``` 38 | - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 39 | UIView *hitView = [super hitTest:point withEvent:event]; 40 | if (hitView == self) { 41 | return nil; 42 | } 43 | return hitView; 44 | } 45 | > ``` 46 | 47 | - How to not cancel other touch event when `UILongPressGestureRecognizer` is triggered? 48 | > Set `cancelsTouchesInView` of `UILongPressGestureRecognizer` to `NO`. 49 | 50 | - How to make several `UIGestureRecognizer` recognize simultaneously? 51 | > Implement `UIGestureRecognizer` delegate method: `- gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:`, and return `YES` when certain both of two `UIGestureRecognizer` could be triggered. 52 | > 53 | > This way, `UIGestureRecognizer` could work simultaneously, between siblings and self, also between superview and self. 54 | > 55 | > Thank system for supporting resting touches. 56 | 57 | - Good UX to implement: 58 | > 1. When grab / drop a dot: 59 | > Apply a simple animation could be very good choice. Just scale the transform and change the alpha of view. 60 | > 2. When user does not click on the center of view, there might be a 'Jump' at first: 61 | > This could be fixed simply move it to the user touch location when view is grabbed. 62 | > 3. 63 | 64 | - Fastest Fix on conflict between `UIView`'s touch event and `UIScrollView`'s `panGestureRecognizer`. 65 | > Just disable, then enable `UIScrollView`'s `panGestureRecognizer` when UIView's `UILongPressGestureRecognizer` triggered. 66 | > This will disable `panGestureRecognizer` for current user touch, but reenable it will allow panGestureRecognizer to recognize new touches from user. 67 | 68 | - How to apply the feature "Touch Delay Gesture Recognizer" from `UIScrollView` to `UIView`. 69 | > 1. Subclass `UIGestureRecognizer`. 70 | > 2. `#import ` 71 | > 3. Introduce a `NSTimer` for the purpose of delay. 72 | > 4. Set `delaysTouchesBegan` to `YES` in initializer. 73 | > 5. Set `UIGestureRecognizer`'s State to **Failed** when timer expired, touch cancelled or touch ended. 74 | > 6. Override `- reset` function to reset timer. 75 | > 7. Add this customized UIGestureRecognizer to the view, which is a subclass of `UIView`. 76 | 77 | - **One More Thing**: how to more easily recognize user's touch when subclass of UIView is pretty small for user to click on? 78 | > Override method `- pointInside:withEvent:` of `UIView`, in the method, check bigger area instead, rather than the bounds of the view. 79 | > 80 | > 44 is a very common number used in iOS system, so use it frequently and wisely. -------------------------------------------------------------------------------- /WWDC2014/WWDC2014_Session236_Building_Interruptible_and_Responsive_Interactions/WWDC2014_Session236_Building_Interruptible_and_Responsive_Interactions.md: -------------------------------------------------------------------------------- 1 | # WWDC2014 Session 236 Building Interruptible and Responsive Interactions 2 | 3 | ### From Gesture to Animation 4 | We have two options here to implement this: 5 | 6 | - Using UIView animateWithDuration 7 | > This actually executes in another process out of context of your application. The render server(like back end) at a higher priority will make sure not dropping any frame on that animation, even the main thread is running a heavy work or blocked by some tasks. It would be easy to have a smooth animation if offload animation onto the render server by using animateWithDuration method. 8 | 9 | - UIDynamicAnimator 10 | > Everything happening is in your process. 11 | > Downside: it's easy to drop animate frame using this tech when thread is busy working on some task. 12 | 13 | - CADisplayLink 14 | > This is where UIDynamicAnimator built on. 15 | > This calls you back once every frame. 16 | 17 | - ~~NSTimer~~ 18 | > Not recommended, highly possible to drop frames. 19 | 20 | ### From Animation to Animation 21 | **Absolute Animation** 22 | 23 | Absolute Animation | Absolute Animation and Begin from Current State 24 | ------------------------- | ------------------------------- 25 | ![Absolute Animation](vlcsnap-2015-08-24-11h53m27s246.png) | ![Absolute Animation and Begin from Current State](vlcsnap-2015-08-24-11h55m43s713.png) 26 | 27 | **Additive Animation** 28 | - Smoother transitions on iOS 8 by default 29 | - Still use BeginFromCurrentState if unsure 30 | - Completion handlers may stack, since the change of animation would not stop or cancel the old animation, it actually create a new animation. Both of them would be finished. 31 | 32 | |Additive Animation|Completion Handler| 33 | |------------------|--------------| 34 | |![Additive Animation](vlcsnap-2015-08-24-13h21m46s063.png) | ![](vlcsnap-2015-08-24-14h48m04s032.png)| 35 | 36 | 37 | |Absolute Animation|Additive Animation| 38 | |------------------|--------------| 39 | |![](vlcsnap-2015-08-24-13h22m22s499.png) | ![](vlcsnap-2015-08-24-13h22m28s162.png)| 40 | 41 | ### From Animation to Gesture 42 | Key part of thie section is converting CGPoint from one coordinate to another. One layer to another layer, or one view to another view. 43 | -------------------------------------------------------------------------------- /WWDC2014/WWDC2014_Session236_Building_Interruptible_and_Responsive_Interactions/vlcsnap-2015-08-24-11h53m27s246.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2014/WWDC2014_Session236_Building_Interruptible_and_Responsive_Interactions/vlcsnap-2015-08-24-11h53m27s246.png -------------------------------------------------------------------------------- /WWDC2014/WWDC2014_Session236_Building_Interruptible_and_Responsive_Interactions/vlcsnap-2015-08-24-11h55m43s713.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2014/WWDC2014_Session236_Building_Interruptible_and_Responsive_Interactions/vlcsnap-2015-08-24-11h55m43s713.png -------------------------------------------------------------------------------- /WWDC2014/WWDC2014_Session236_Building_Interruptible_and_Responsive_Interactions/vlcsnap-2015-08-24-13h21m46s063.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2014/WWDC2014_Session236_Building_Interruptible_and_Responsive_Interactions/vlcsnap-2015-08-24-13h21m46s063.png -------------------------------------------------------------------------------- /WWDC2014/WWDC2014_Session236_Building_Interruptible_and_Responsive_Interactions/vlcsnap-2015-08-24-13h22m22s499.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2014/WWDC2014_Session236_Building_Interruptible_and_Responsive_Interactions/vlcsnap-2015-08-24-13h22m22s499.png -------------------------------------------------------------------------------- /WWDC2014/WWDC2014_Session236_Building_Interruptible_and_Responsive_Interactions/vlcsnap-2015-08-24-13h22m28s162.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2014/WWDC2014_Session236_Building_Interruptible_and_Responsive_Interactions/vlcsnap-2015-08-24-13h22m28s162.png -------------------------------------------------------------------------------- /WWDC2014/WWDC2014_Session236_Building_Interruptible_and_Responsive_Interactions/vlcsnap-2015-08-24-14h48m04s032.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2014/WWDC2014_Session236_Building_Interruptible_and_Responsive_Interactions/vlcsnap-2015-08-24-14h48m04s032.png -------------------------------------------------------------------------------- /WWDC2014/WWDC2014_Session237_A_Strategy_for_Great_Work/WWDC2014_Session237_A_Strategy_for_Great_Work.md: -------------------------------------------------------------------------------- 1 |

This session is presented by Ken, who has more than 10 yrs experience working at Apple. Here are 10 Lessons he shared in this session.

Know a good idea when you see it 

Don't try to solve every problem at once 

Find smart friends and listen to them 

Work should explain itself

2 | Choose the simplest thing which might work

Only show your best work

Iterating quickly leads to better work

Be kind to people, but be honest about work 

Separate yourself from your work 

You’re never done 3 |

I specially present my affection on the following Lesson and Quote. Love this session.

image
image
4 | -------------------------------------------------------------------------------- /WWDC2014/WWDC2014_Session237_A_Strategy_for_Great_Work/p1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2014/WWDC2014_Session237_A_Strategy_for_Great_Work/p1.png -------------------------------------------------------------------------------- /WWDC2014/WWDC2014_Session237_A_Strategy_for_Great_Work/p2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2014/WWDC2014_Session237_A_Strategy_for_Great_Work/p2.png -------------------------------------------------------------------------------- /WWDC2014/WWDC2014_Session418_Improving_Your_App_with_Instruments/WWDC2014_Session418_Improving_Your_App_with_Instruments.md: -------------------------------------------------------------------------------- 1 | In this session, presenters presents what's new in instruments, few technics for memory management, capture list in swift to avoid retain strong reference cycle, and Time Profiling. 2 | 3 | ## Why use Time Profiling? 4 | - Faster app launch times 5 | - Kepp frame rate at 60fps 6 | - Buttery-smooth scrolling 7 | - Responsive UI 8 | 9 | ## What is Time Profiling? 10 | Samples stack trace information at prescribed intervals, providing an idea of how much time each method takes. 11 | 12 | ## When use Time Profiler? 13 | - Frame rate slowdowns 14 | - Some part of your app takes too long 15 | 16 | **Keep an eye on CPU usage in Xcode** 17 | 18 | - Threads strategy 19 | - Enable Record Waiting Threads to expose blocked threads 20 | 21 | #### Ignore unwanted data 22 | - Charge moves the associated cost 23 | - Prune removes the associated cost 24 | - Focus is "Prune everything but" 25 | 26 | NOTE: did't finish the 3rd part focusing on **Performance Counter** 27 | -------------------------------------------------------------------------------- /WWDC2015/WWDC2015_Session230_Performance_on_iOS_and_watchOS/WWDC2015_Session230_Performance_on_iOS_and_watchOS.md: -------------------------------------------------------------------------------- 1 | # WWDC2015 Session 230 Performance on iOS and watchOS 2 | 3 | ## Why should I think about performance? 4 | It's a feature in your app that you should have on your mind all the time. 5 | - Responsiveness delights and engages users 6 | - Be a good neighbor, especially in Multitasking on iPad 7 | - Efficient apps extend battery life 8 | - Supports the whole range of iOS 9 hardware 9 | 10 | ## Thinking About Performance 11 | - Choosing technologies 12 | - Know the technologies 13 | - Pick the best ones for your app 14 | - Apple technologies are optimized (we use them) 15 | - Benifit from updating 16 | - Taking measurements 17 | - Animations: Instruments: Core Animation 18 | - Responsiveness: Core instrumentation, Instruments: System Trace 19 | - Don't ship your instrumentation: Create a copy of release scheme in Xcode, and define one additional define, so you could build a release version of the app with performance instrumentation quickly and easily. 20 | - Collect start and end times: CFAbsoluteTimeGetCurrent 21 | - Taps and button presses: IBAction, touchesEnded, UIGestureRecognizer target 22 | - Tabs and modal views: viewWillAppear, viewDidAppear, will show how long it takes to display a the view. 23 | - Memory: Xcode debugger, Instruments Allocations, Instruments Leaks 24 | - Allocate, Reallocate memory takes time. 25 | - Ref: iOS App Performance: Memory, WWDC12 26 | - Ref: Improving Your App with Instruments, WWDC14 27 | - Ref: Optimzing Your App Multitasking on iPad in iOS 9 28 | - Setting goals 29 | - 60fps scrolling and animations. 30 | - Ref: Advanced Graphics and Animations for iOS Apps, WWDC14 31 | - Respond to user actiosn in 100ms 32 | 33 | - Performance Workflow 34 | > Reproduce -> Profil -> Measure -> Change code -> Reproduce 35 | 36 | - Profiling vs Measuring 37 | - Profiling: Unsderstanding overall app activity 38 | - Xcode debugger 39 | - Instruments: Time Profiler 40 | - Measuring: Instrumenting a specific action 41 | - CGAbsoluteTimeGetCurrent 42 | - Instruments: System Trace 43 | 44 | - Avoid Using the Main Thread for 45 | - CPU-intensive work 46 | - Tasks that depend on external resource 47 | 48 | - Common Blocking Calls 49 | > Any code path that ends up making a syscall 50 | > 51 | > Accessing resources not currently in memory: Disk I/O, Network access 52 | > 53 | > Waiting for work to complete on another thread 54 | 55 | - Networking: NSURLConnection and frineds 56 | - Use asynchronous API 57 | - Use GCD, Ref: Building Responsive and Efficient Apps with GCD 58 | - NSURLSession background session 59 | - Foundation initializers 60 | - contentsOfFile: 61 | - contentsOfURL: 62 | - Core Data 63 | - Move some Core Data work to different concurrency modes. Ref: What's New in Core Data, Mission. 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /WWDC2015/WWDC2015_Session231_Cocoa_Touch_Best_Practices/WWDC2015_Session231_Cocoa_Touch_Best_Practices.md: -------------------------------------------------------------------------------- 1 | # WWDC2015 Session 231 Cocoa Touch Best Practices 2 | 3 | ## App Lifecycle 4 | 5 | ### Beyond App Launch, Being responsive to every input 6 | - Put on the work to the background queue, when you are done with it, put it back to main queue. 7 | ### Leverage Frameworks 8 | - Target two most recent major releases 9 | 10 | ## Views and View Controllers 11 | ### Layout to Proportions 12 | - Avoid hard-coded layout values 13 | ### Size Classes 14 | - Some size thresholds trigger major change 15 | - Propertyeis, Not Tags. Keep a property instead. 16 | ### Leverage UIViewControllerTransitionCoordinator 17 | - Animate alongside a transition 18 | - Get accurate completion timing 19 | - Support interactive and cancelable animations 20 | 21 | ## Auto Layout 22 | ### Modify Constraints Efficiently 23 | - Identify constraints that get changed, added, or removed 24 | - Unchanged constraints are optimized 25 | - **Avoid removing all constraints** 26 | - Use explicit constraint references 27 | ### Constraint Specificity 28 | - De-duplicating constraints 29 | - Duplicates are implied by existing constraints 30 | - Duplicates cause excess work in layout engine 31 | - Create flexible constraints 32 | - Avoid hard-coded values 33 | - Describe constraints using bounds 34 | - Fully specify constraints 35 | - Testing and debugging 36 | - `-[UIView hasAmbiguousLayout]`, When called on UIWindow, returns result for entire view tree 37 | - `-[UIView _autolayoutTrace]`, Call this method on a view. It returns a string with diagnostic information about the entire view hierarchy containing that view. Ambiguous views are labeled, and so are views that have translatesAutoresizingMaskIntoConstraints set to YES. 38 | - This could be used in Unit Test, try call `-[UIView hasAmbiguousLayout]` first, if it returns `YES`, then call `-[UIView _autolayoutTrace]` to help figure out the cause. 39 | 40 | ## Table and Collection Views 41 | ### Self-Sizing Cells 42 | - Fully specify constraints 43 | - Width = input; height = output. 44 | - Tip: add a constraint to cell's content view, height 45 | ### Animating Height Changes 46 | Naive way: update the model, then call `tableView.reloadData()` 47 | Promoted way: 48 | - **`tableView.beginUpdates`** 49 | - Update model 50 | - Update cell contents, might just **call `tableView.cellForRowAtIndexPath` and update the content with corresponding model.** 51 | - **`tableView.endUpdates`** 52 | ### Fast CollectionView Layout Invalidation 53 | - Invalidate on bounds change 54 | - Build [targeted invalidation context](https://developer.apple.com/documentation/uikit/uicollectionviewlayoutinvalidationcontext) 55 | - Repeat as necessary 56 | -------------------------------------------------------------------------------- /WWDC2015/WWDC2015_Session411_Swift_in_Practice/WWDC2015_Session411_Swift_in_Practice.md: -------------------------------------------------------------------------------- 1 | # WWDC2015 Session 411 Swift in Practice 2 | To find more issues during the compile time. 3 | 4 | I was directed from Book _Core Data_ to the know the existence of this wonder talk, regarding how to make compiler work better for developer. 5 | 6 | ## Take advantage of new APIs while deploying to older OS releases 7 | __Problem__: Users on Different OS Releases 8 | 9 | __Solution__: Adopt new features and support the older OS releases 10 | - Always use the __Latest SDK__ to access complete set of APIs 11 | - Use Deployment Target to set an application's minimum supported OS release 12 | 13 | - [:x:]Manually check Framework, Class, etc. 14 | - Framework: mannually check framework as optional 15 | - Class: mannually check if a method/function available. 16 | - [:heavy_check_mark:]Compile-Time API Availability Checking. 17 | 18 | ## Enforce expected application behavior using enums and protocols 19 | ### Use Case: Asset Catalog Identifiers 20 | ``` 21 | extension UIImage { 22 | enum AssetIdentifier: String { 23 | case isabella = "Isabella" 24 | case william = "William" 25 | case Olivia = "Olivia" 26 | } 27 | 28 | convenience init!(assertIdentifier: AssetIdentifier) { 29 | self.init(named: assertIdentifier.rawValue) 30 | } 31 | } 32 | ``` 33 | - Centrally located constants 34 | - Doesn't pollute global namespace 35 | - Must use one of the enum cases 36 | - Image initialization are not failable 37 | ### Use Case: Segue Identifiers 38 | ``` 39 | class ViewController: UIViewController { 40 | enum SegueIdentifier: String { 41 | case ShowImportUnicorn = "ShowImportUnicorn" 42 | case ShowCreateNewUnicore = "Show CreateNewUnicorn" 43 | } 44 | 45 | override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 46 | guard let identifier = segue.identifier, segueIdentifier = SegueIdentifier(rawValue: identifier) 47 | else { fatalError("Invalid segue identifier \(segue.identifier).")} 48 | 49 | switch segueIdentifier { 50 | case .ShowImportUnicorn: // Config... 51 | case .ShowCreateUnicor: // Config... 52 | } 53 | } 54 | } 55 | ``` 56 | When new case added to enum, then the compiler will tell us switch is not exhausted. 57 | ``` 58 | class ViewController: UIViewController { 59 | func performSegueWithIdentifier(segueIdentifier: SegueIdentifier, sender: AnyObject?) { 60 | performSegueWithIdentifier(segueIdentifier.rawValue, sender: sender) 61 | } 62 | } 63 | ``` 64 | 65 | ### To avoid duplicate all of the smart solution showed above, use `Protocol` 66 | ``` 67 | protocol SegueHandlerType { 68 | typealias SegueIdentifier: RawRepresentable 69 | } 70 | 71 | // Shared Implementation. 72 | extension SegueHandlerType where Self: UIViewController, SegueIdentifier.RawValue == String { 73 | func segueIdentifier(for segue: UIStoryboardSegue) -> SegueIdentifier { 74 | guard let identifier = segue.identifier, 75 | let segueIdentifier = SegueIdentifier(rawValue: identifier) 76 | else { fatalError("Unknown segue: \(segue))") } 77 | return segueIdentifier 78 | } 79 | 80 | func performSegueWithIdentifier(segueIdentifier: SegueIdentifier, sender: AnyObject?) { 81 | performSegueWithIdentifier(segueIdentifier.rawValue, sender: sender) 82 | } 83 | } 84 | 85 | class ViewController: UIViewController, SegueHandlerType { 86 | enum SegueIdentifier: String { 87 | // ... 88 | } 89 | } 90 | ``` 91 | -------------------------------------------------------------------------------- /WWDC2015/WWDC2015_Session413_Advanced_Debugging_and_the_Address_Sanitizer/BreakpointsList.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2015/WWDC2015_Session413_Advanced_Debugging_and_the_Address_Sanitizer/BreakpointsList.png -------------------------------------------------------------------------------- /WWDC2015/WWDC2015_Session413_Advanced_Debugging_and_the_Address_Sanitizer/WWDC2015_Session413_Advanced_Debugging_and_the_Address_Sanitizer.md: -------------------------------------------------------------------------------- 1 | # WWDC2015 Session 413 Advanced Debugging and the Address Sanitizer 2 | In this session, several debugging tools will be demoed in a very pratical way. 3 | 4 | ## View Debugger 5 | - Focus on troublesome views 6 | - Visualize your constraints 7 | 8 | View Debugger helps you visualize the hiechracy of views in current view. It's a great way to view the relationship between views(sibling and parent/child), also it's a great place to see the auto layout constraints between these views. 9 | 10 | ## Advanced Breakpoint Actions 11 | - Catch exceptions at throw, print message 12 | - Print expressions without adding clutter 13 | 14 | Under Breakpoint Navigator, user could mannually add variety breakpoints, shows in the following image. 15 | ![BreakpointList](./BreakpointsList.png) 16 | 17 | In the demo, click 'Exception Breakpoint' to add a general exception breakpoint, but this would not show any exception error information. 18 | 19 | To display further information about exception error, one trick to do is in the console at the breakpoint, "`po $arg1`" could print out the lastest exception error message in the console, which means we could add this as an action for corresponding breakpoint. 20 | ## Address Sanitizer (ASan) 21 | Enable this tool in `Edit Scheme...` under `Diagnostic` 22 | 23 | The benifit of using ASan to Analyze Memory Corruption 24 | - Use after free 25 | - Heap buffer overflow 26 | - Stack buffer overflow 27 | - Global variable overflow Overflows in C++ containers 28 | - Use after return 29 | 30 | It's better to use it under none [-O0] optimization configuration. 31 | 32 | ## Other Tools -------------------------------------------------------------------------------- /WWDC2016/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/WWDC2016/.DS_Store -------------------------------------------------------------------------------- /WWDC2016/WWDC2016_Session301_Introducing_Expanded_Subscriptions_in_iTunes_Connect/WWDC2016_Session301_Introducing_Expanded_Subscriptions_in_iTunes_Connect.md: -------------------------------------------------------------------------------- 1 | # WWDC2016 Session 301 Introducing Expanded Subscriptions in iTunes Connect 2 | 3 | ## Roadmap 4 | 5 | ### What is an In-App Purchase 6 | Digital content or service bought within app 7 | - Consumable 8 | - Non-consumable 9 | - Non-renewable subscriptions 10 | - Auto-renewable subscriptions 11 | 12 | ### Auto-Renewable Subscriptions 13 | 14 | #### Increased proceeds 15 | Proceeds goes from 70% to 85% for subscriptions over a year. 16 | 17 | #### Subscription Groups 18 | Only one of subscription in a single group could be selected, if the app needs to support multiple subscriptions to be active at the same time, then multiple subscritpion groups should be created. 19 | 20 | In the same group, the level of subscription could be offered for the different subscription, thus, user could upgrade/downgrde subscription level. 21 | 22 | 23 | #### Territory Pricing 24 | Price could be customized for each territory. 25 | 26 | #### Customer Retention 27 | Using _Push Notification_ and highly customized _Email_ would be a good idea to keep attracting exisiting customers. 28 | 29 | #### Preserve Price 30 | Multiple ways to manipulate the prices. 31 | - Initial price could be offered for the soft launch (Early adopters). 32 | - A different price could be offered after trial period. 33 | - Increase the price without changing exisiting customers, afater a certain date. 34 | - Increase the price without changing early adopters price, after a certain date. 35 | - Early adopters price could also be changed. (That will be effective immediately.) -------------------------------------------------------------------------------- /WWDC2016/WWDC2016_Session403_Swift_API_Design_Guidelines/WWDC2016_Session403_Swift_API_Design_Guidelines.md: -------------------------------------------------------------------------------- 1 | # WWDC2016 Session 403 WWDC2016 Session 403 Swift API Design Guidelines 2 | 3 | ## Roadmap 4 | 5 | ### Swift API Design Guidelines 6 | 7 | *Clarity* 8 | 9 | 10 | ###### “ed”rule 11 | 12 | `x.reverse() // mutating` 13 | 14 | `let y = x.reversed() // non-mutating` 15 | 16 | 17 | ###### “ing” rule 18 | 19 | `documentDirectory.appendPathComponent(".list") // mutating` 20 | 21 | `let documentFile = documentDirectory.appendingPathComponent(".list") // non-mutating` 22 | 23 | 24 | ### The Grand Renaming 25 | 26 | ``` 27 | extension MyController { 28 | @objc(handleDrag:forEvent:) 29 | func handleDrag(sender: UIControl, for event: UIEvent) { } // handleDrag(sender:for:) 30 | } 31 | 32 | // Generated Objective-C 33 | @interface MyController () 34 | - (void)handleDragWithSender:(UIControl *)sender for:(UIEvent *)event; 35 | @end 36 | 37 | // After adding @objc(handleDrag:forEvent:) 38 | // Generated Objective-C 39 | @interface MyController () 40 | - (void)handleDrag:(UIControl *)sender forEvent:(UIEvent *)event; 41 | @end 42 | ``` 43 | 44 | ### Mapping Objective-C APIs into Swift 45 | 46 | ``` 47 | // Objective-C 48 | typedef NSString * NSCalendarIdentifier NS_EXTENSIBLE_STRING_ENUM; 49 | NSCalendarIdentifier NSCalendarIdentifierGregorian; 50 | 51 | // Generated Swift Interface 52 | struct NSCalendarIdentifier : RawRepresentable { 53 | init(_ rawValue: String); 54 | var rawValue: String { get } 55 | static let gregorian: NSCalendarIdentifier 56 | } 57 | ``` 58 | -------------------------------------------------------------------------------- /WWDC2016/WWDC2016_Session418_Using_Time_Profiler_In_Instruments/WWDC2016_Session418_Using_Time_Profiler_In_Instruments.md: -------------------------------------------------------------------------------- 1 | # WWDC2016 Session 418 Using Time Profiler In Instruments 2 | 3 | ## Intro to profiling 4 | How much and what kind of work is my app doing? 5 | 6 | The Call Tree displays counter of each calls, it doesn't measure the duration of each calls, even ignore/lose some quick/short calls. So, it shows long running calls and the most repetitive calls. 7 | 8 | ## Going faster 9 | - Focused on an area of high CPU usage 10 | > Zoom and Select area will help focus on the "Problems", which filters out all other unrelevent calls. 11 | - Examined the call tree, looking for where the work was happening 12 | - Walked back to our code 13 | - Insepected our code 14 | - Made it faster 15 | - Verified the changes 16 | - Saved the user's time 17 | 18 | ## Doing less 19 | - Focused on low, but __unexpected__ CPU usage 20 | - Examined the call tree 21 | - Determined the frameworkds involved 22 | - Stopped doing unnecessary work 23 | - Verified the changes 24 | - Improved battery life 25 | 26 | ## Improving responsiveness 27 | 28 | ###### Problem: The main thread does all the UI work 29 | - Runloop waiting for events 30 | - Sends events to your UIApplication instance 31 | - Passes through the responder chain 32 | - Your code gets invoked 33 | 34 | ###### Phenomenon: When busy, the main thread can't process events 35 | - The queue backs up 36 | - Stuttering and hiccups 37 | - App becomes unresponsive 38 | 39 | ###### What to Do: Keep your main thread Free 40 | - Examined the CPU spikes 41 | - Focused on the main thread 42 | - Identified non-UI work happening on the main thread 43 | - Distributed the work across multiple threads 44 | - Verified the changes 45 | - Achieved a better user experience 46 | 47 | ## Tips 48 | - Always profile release builds 49 | - Always profile on the device 50 | - Run with old devices 51 | - Use large data sets where it makes sense 52 | - Look for **poorly scaling code** (O(n^2), etc.) 53 | 54 | ## Summary 55 | - Optimaize High CPU usage 56 | - Remove Unexpected CPU usage 57 | - Move heavy work away from main thread -------------------------------------------------------------------------------- /WWDC2018/WWDC2018_Session705_Engineering_Subscriptions/WWDC2018_Session705_Engineering_Subscriptions.md: -------------------------------------------------------------------------------- 1 | # WWDC2018 Session 705 Engineering Subscriptions - Implementaion Best Practices 2 | 3 | ## 1. Device and Server Architecture 4 | 5 | ### What is a subscription? 6 | 1. Receive Transaction 7 | 2. Verify Authenticity 8 | - App Store Receipt: 9 | 10 | It's a trusted record of App and In-App purchases, stored on device, issued by the App Store. 11 | It's for your app, on that device only. 12 | 13 | - Receipt Validation: 14 | 15 | On-device vs Server-to-server 16 | 17 | - __NOT__ Use online validation directly from the device. 18 | - Request from Apple 19 | - Send binary receipt data to my own server. 20 | - The server send it to Apple Server to get it verified or not. 21 | 22 | 23 | 3. Update Subscription Status 24 | 25 | __orignal_transaction_id -> user’s subscription ID__ 26 | 27 | Does user have active subscription? 28 | 1. Filter transactions by orignal_transaction_id 29 | 2. Find the transaction with latest expires_date (sort transactions by expires_date) 30 | 3. Date in the past shows user not active subscribed. 31 | 4. Date in future shows user active 32 | 33 | #### Status Polling 34 | 35 | Discover new transactions directly from your server. 36 | 37 | - Save latest version of encoded receipt data on your serer(latestReceiptData, exclude-old-transactions: true) 38 | - Treat receipt data like a token 39 | - /verifyReceipt response also includes new transactions 40 | - Located in the latest_receipt_info field 41 | - Unlock new subscription periods without waiting for app to launch 42 | 43 | New transactions will still appear in StoreKit on next app launch 44 | - Must verify and finish these transactions 45 | - Even if your server already knows about them 46 | - Opportunity to update latest receipt data on server 47 | 48 | Reacting to Billing Issues 49 | 50 | 1. Observe no renewal transaction appears 51 | 2. Direct user to amend their billing details 52 | 3. Unblock user immediately when transaction occurs 53 | 1.1 Server-to-Server Notification 54 | 1.1.1 Status URL in App Store Connect 55 | 1.1.2 HTTPS POST to your server for status changes 56 | 1.1.3 Includes latest_transaction_info for the transaction in question (support ATS) 57 | 58 | 59 | 60 | 61 | ## 2. In-App Experience 62 | 1. Creating User Accounts 63 | 2. Introductory Pricing 64 | 3. Upgrade/Downgrade Subscriptions 65 | 4. Subscription Management 66 | 67 | ## 3. Reducing Subscriber Churn 68 | 69 | Problem: 70 | 1. Involuntary churn 71 | 2. Voluntary churn 72 | 3. Winback 73 | 74 | Solution: 75 | 1. Leverage subscription specific receipt fields 76 | 2. Implement status polling 77 | 3. Implement customer messaging 78 | 4. Present contextual subscription offers 79 | 80 | ## 4. Analytics and Reporting 81 | 82 | ## Summary 83 | - Server side state management offers more flexibility 84 | - Use notifications from the App Store 85 | - Offer introductory pricing 86 | - Reduce churn with simple messaging 87 | - Win back users with alternative subscription options 88 | - New reporting tools in App Store Connect -------------------------------------------------------------------------------- /WWDC2019/WWDC2019_Session239_Great_Developer_Habits/WWDC2019_Session239_Great_Developer_Habits.md: -------------------------------------------------------------------------------- 1 | # Great Developer Habits 2 | 3 | ### Organize 4 | 1. Functional organization with groups 5 | 2. Mirror project structure and file structure 6 | 3. Break apart large storyboards 7 | 4. Modernize your project file 8 | 5. Throw away code scraps 9 | 6. Address the root cause of warnings 10 | 11 | ### Track (Source Control) 12 | 1. Use source control (git) 13 | 2. Keep commits small and isolated 14 | 3. Write useful commit messages (What I was thinking at that moment?) 15 | 4. Utilize branches for bug and feature work 16 | 17 | ### Document 18 | > “I don’t need comments, my code is self-documenting" 19 | 20 | But it's better to make meaningful comment to explain why, not just what. 21 | 22 | 1. Comments are critical for future understanding 23 | 2. Good comments provide background and reasoning 24 | 3. Use descriptive variable and constant names 25 | 4. Include documentation 26 | 27 | ### Test (Unit Test) 28 | 1. Write unit tests 29 | 2. Run unit tests before committing code 30 | 3. Build a foundation for continuous integration 31 | 32 | ### Analyze 33 | 1. Simulate poor networks with Network Link Conditioner 34 | 2. Use sanitizers and checkers 35 | 3. Measure performance and efficiency with Debug Gauges 36 | 4. Investigate issues with Instruments 37 | 38 | ### Evaluate 39 | 1. Include code review as part of your practice 40 | 41 | No code would be used in practice until it has been code reviewed. 42 | 43 | 2. Understand each line 44 | 3. Build it 45 | 4. Run tests 46 | 5. Proofread for style, spelling, and syntax 47 | 48 | ### Decouple 49 | 1. Determine functional segments and break them out 50 | 2. Scale your work across multiple apps 51 | 3. Improve efficiency with extensions 52 | 4. Share your efforts with the broader community 53 | 5. Documentation is critical 54 | 55 | ### Manage 56 | 1. Use community and open source projects responsibly 57 | 2. Understand dependencies thoroughly 58 | 3. Ensure that privacy is respected 59 | 4. Have a plan if a dependency goes away or is no longer maintained -------------------------------------------------------------------------------- /WWDC2019/WWDC2019_Session412_Debugging_in_Xcode_11/WWDC2019_Session412_Debugging_in_Xcode_11.md: -------------------------------------------------------------------------------- 1 | # Debugging in Xcode 11 2 | 3 | ## Device Conditions and Environment Overrides 4 | 5 | ### Device Conditions 6 | - Thermal state condition: 7 | 8 | ProcessInfo.thermalStateDidChangeNotification 9 | 10 | ``` swift 11 | let state = ProcessInfo().thermalState 12 | ``` 13 | 14 | - Select 'Debug Navigator -> Energy Impact' to view 15 | - 'Window -> Devices and Simulators' -> Target Device -> 'Device Conditions' 16 | 17 | To turn down the condition, three ways to do: 18 | - Click stop button in Xcode under 'Device Conditions'. 19 | - Disconnect iPhone device from Xcode. 20 | - Click the top left of status bar to confirm and stop conditions. 21 | 22 | - Network link condition 23 | 24 | ### Environment Overrides 25 | - Interface Style 26 | Turn between light mode and dark mode. 27 | 28 | - Dynamic Type 29 | Use system font is a better choice. 30 | 31 | - Accessibility 32 | 33 | ## Debugging Live Previews 34 | 35 | 36 | ## Debugging SwiftUI View Hierarchies 37 | -------------------------------------------------------------------------------- /WWDC2019/WWDC2019_Session901_Whats_New_in_Core_Bluetooth/WWDC2019_Session901_Whats_New_in_Core_Bluetooth.md: -------------------------------------------------------------------------------- 1 | # What's New in Core Bluetooth 2 | 3 | ### Introduction 4 | 5 | ### Low energy 2 Mbps 6 | 1. Bluetooth 5.0 7 | 2. Support LE 2M bps 8 | 9 | ### Advertising extensions 10 | 11 | 12 | ### Core Bluetooth for BR/EDR 13 | 14 | ### Core Bluetooth dual-mode 15 | 16 | ### User privacy 17 | 18 | ### PacketLogger 19 | 20 | ### Summary -------------------------------------------------------------------------------- /WWDC2020/WWDC2020_Session10176_Master_Picture_in_Picture_on_tvOS/WWDC2020_Session10176_Master_Picture_in_Picture_on_tvOS.md: -------------------------------------------------------------------------------- 1 | # WWDC 2020 Session 10176 Master Picture in Picture on tvOS 2 | 3 | ## Add PIP feature on tvOS 4 | 1. Add capability in target -> background modes -> Audio, AirPlay, and PiP 5 | 2. Configure the audio session to .playback category 6 | ```swift 7 | let audioSession = AVAudioSession.sharedInstance() 8 | do { 9 | try audioSession.setCategory(.playback) 10 | } catch { 11 | print("Setting category to AVAudioSessionCategoryPlayback failed.") 12 | } 13 | ``` 14 | 3. Using the standard playback UI 15 | - Enabled by default 16 | - Lifecycle AVPlayerViewControllerDelegate in tvOS 14 17 | ```swift 18 | _ = pipController.observe(\.canStopPictureInPicture) { controller, change in 19 | // Update your UI 20 | if controller.canStopPictureInPicture { 21 | pipActions = [.swap, .stop] 22 | } else { 23 | pipActions = [.start] 24 | } 25 | } 26 | ``` -------------------------------------------------------------------------------- /WWDC2020/WWDC2020_Session10654_Create_Swift_Playgrounds_content_for_iPad_and_Mac/WWDC2020_Session10654_Create_Swift_Playgrounds_content_for_iPad_and_Mac.md: -------------------------------------------------------------------------------- 1 | # WWDC2020_Session10654_Create_Swift_Playgrounds_content_for_iPad_and_Mac 2 | 3 | This session introduces the fundermental information about creating Swift Playground content on iPad and Mac. 4 | 5 | ## Take advantage of the UI differences 6 | 7 | ## Customizing content for each platform 8 | ### Specify the supported device type and capabilities 9 | 1. Use the `SupportedDevices` key in `Manifest.plist` and `supportedDeevices` in `feed.json` to show the supported device type, e.g. Mac or iPad or "iPad and Mac" 10 | 2. Use the `requiredCapabilities` to specify required capabilities. `RequiredCapabilities` in `manifest.plist` and `requiredCapabilities` in `feed.json`. Capabilities includes camera, microphone, and so on. 11 | ### Use target enviroment checks to customize content 12 | ``` 13 | #if targetEnvironment(macCatalyst) 14 | // do something on mac 15 | showTurtleInAR() 16 | #else 17 | // do something on iPad 18 | showTurtleOnScreen() 19 | #endif 20 | ``` 21 | ## Respect the platform's settings 22 | 1. Try to use system color, and could specify customized colors in Asset catelog. 23 | 2. Use safe area layout guides. -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /push_with_msg.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | touch tmp.txt 4 | 5 | #echo "---" >> tmp.txt 6 | #echo "" >> tmp.txt 7 | #echo "date: $(date '+%Y-%m-%d %H:%M')" >> tmp.txt 8 | #echo "description: WWDC Watch Log" >> tmp.txt 9 | #echo "tags: tech" >> tmp.txt 10 | #echo "title: WWDC Learning Notes" >> tmp.txt 11 | #echo "" >> tmp.txt 12 | #echo "---" >> tmp.txt 13 | #echo "" >> tmp.txt 14 | #echo "" >> tmp.txt 15 | #cat README.md >> tmp.txt 16 | #cat tmp.txt > ~/Tech/Resolution/Content/tech/wwdc_learning_note.md 17 | # 18 | #rm tmp.txt 19 | 20 | COMMIT_MSG='Watch ...' 21 | 22 | if [ $# -gt 0 ]; then 23 | COMMIT_MSG="$1" 24 | fi 25 | 26 | # echo "message: ${COMMIT_MSG}" 27 | 28 | git add . 29 | 30 | git commit -m "${COMMIT_MSG}" 31 | 32 | git push origin master 33 | 34 | -------------------------------------------------------------------------------- /tmp.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antonio081014/WWDC_Learning_Review/a5204c65a305ea35c84e3cfdb2d803301082ff7b/tmp.txt --------------------------------------------------------------------------------