Skip to content
This is a repo for me to keep track of my self training
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


This is a self help repo for me to keep track of my journy as I challenge myself to code better.

Mostly this is for iOS development, but who knows what else will be in here.

I've been watching some videos from Sean Allen:

Structs vs Classes

Stuff I want to learn

  • Hashable protocol
  • Sequence protocol: A type that provides sequential, iterated access to its elements. (the base or foundation of collections)
  • Collection protocol: A sequence whose elements can be traversed multiple times, nondestructively, and accessed by an indexed subscript (inherits from Sequence)
  • Bidirectional Collection: A collection that supports backward as well as forward traversal.
  • Other Protocols
  • Optionals - it's just an enum with case some or none.
  • Error Handling!
  • Generics
  • Iterators

After talking with my manager, we've talked about different ways for me to improve my development skillsets on my own. Here are some of our ideas:

Ideas for learning

Specific WWDC Videos I want to watch: == watched

  • Introduction to Sprite Kit
  • Advances in Objective-C
    • #import > Copy/paste text headers into .m files
    • @import > Imports module (which encapsulates a framework and is compiled separately) Imports the API - Semantic import (doesn't need to parse headers. Local macro definitions have no effect on framework API)
    • Submodules @import iAd.ADBannerView; Similar to #import <iAd/ADBannerView.h>
    • Autolinking. No need to manuallly "link binary with libraries" (I don't get this yet)
    • Xcode Automatically changes #import into @import now... No code changes needed
    • how's it work? Module Maps > Establish relationship between headers and modules. Modules are cached in derived data. Next time you import a module, it is already there.
    • instancetype vs id - A contextual keyword, only for return types. Subclasses do not need to redeclare instance type methods. The compiler contextually matches the return type to the receiver
    • Enums are/were essentailly global integers
  • Getting the Most out of Playgrounds in Xcode

  • Embracing Algorithms

    • Talks about different collection methods
    • Talked about different protocols
  • Swift Generics

  • Building for Voice with Siri Shortcuts

  • High Performance Auto Layout

  • Introducing ClassKit

  • Introduction to Siri Shortcuts

    • Define a shortcut for each action you want
      • Accelerate user to perform a key function of your app
      • Be of persistant interest to the user. The user might want to do multiple times
      • Be executable at any time. No state!
      • 2 APIs for supporting shortcuts:
        • NSUserActivity is a light weight way to let siri know
          • Opens something in your app
          • Represents showing items that you index in spotlight search of for handoff.
          • you use use this for lots of activities in your app so siri can offer better suggestions
          • Example:
            let activity = NSUserActivity(activityType: "com.AppCoda.SiriSortcuts.sayHi") // 1
            activity.title = "Say Hi" // 2
            activity.userInfo = ["speech" : "hi"] // 3
            activity.isEligibleForSearch = true // 4
            activity.isEligibleForPrediction = true // 5
            activity.persistentIdentifier = NSUserActivityPersistentIdentifier(rawValue: "com.AppCoda.SiriSortcuts.sayHi") // 6
            view.userActivity = activity // 7
            activity.becomeCurrent() // 8
        • Intents. Siri has built in intents. Custom intents!
    • Donate shortcut tell system every time the user does something in your app that you expose a shortcut for. Lets siri learn when and where is the right time to sugest your shortcut.
      • Turn on debugging by going to Settings > Developer and enable Display Recent Shortcuts and Display Donations on Lock Screen
    • Handle shortcut when the user wants to use your shortcut, you need to be ready for your app or app extension to handle
  • UIKit: Apps for Every Size and Shape

General Notes

  • Set Algebra: Subtraction, Intersection, Union.
  • NSSet is like a dictionary without values.
  • Options... if let, ?? ! !

Internal Frameworks

  • Whats New
  • TubePlayer
  • Planning Center Cache
  • Random Image
  • Upload Service
  • Plannin Center Router
  • Audio Player Cache
  • MCT Audio Player
  • Alert View
  • Services Sidebar
  • Document Store
  • PCOKit
  • PCOCocoa
    • Network Cache
    • Loper
    • Socket Rocket
    • Open Sky Operation
    • Planning Center Auth
    • MCT Object Store
    • MCT JSON

3rd Party Frameworks in PC

  • Zendesk
  • 1Password
  • Fabric
  • Crashlytics
  • React Native

External Frameworks

Apple Framework


More frameworks to review:

Mentor Notes

11/16 @11am notes:

Notes for next Mentorship

  • Talk about sidebar blockout data grouping NSArray <NSArray<PCOBlockout *> *> *blockouts Used a NSFetchedResultsController with a sectionNameKeyPath
  • Talk about code compilation process. Talk about what happens when you hit command+B, and when you archive.
  • Talk about schedule conflicts and how to keep them out of the database, and use them in memory only. (check BlockoutDeclineExistingPlansPickerController)
  • Review JSON mapping and Core Data interactions. Talk about API call.
  • Write more swift!

Mentor Stuffs

  • PCOServicesCoreDataStack.m uses + (BOOL)prepareCoreDataStack:(NSError **)error. What's the double ** about. I know &error is a reference pointer, but I don't know what ** is. Answer: ** is a pointer to a pointer. Since functions in C take arguments by value, it means you can't change the value of the argument in that function. But, by providing a level of indirection and passing a pointer to the pointer, you can change the value.

Mentor notes from 12/6

  • Talked about writing swift in services with new controllers. and use snapkit maybe for swift stuff.
  • Try talking about implementation strategy with James before working on another big task.

Questions for next session

  • Review where state should be held for Household Filters (Notes in notebook)

Talk about different

  • Imparative programming
  • Functional programming
  • Object Oriented programming
  • Inheritance-based programming
  • Prototytpe-based programming
  • Declarative programming

^ Relevant

  • Find a video to watch and discuss next time.

1/2/2019 notes:

Got together to talk about blockout conflict implementation strategy found here:

1/3/2019 notes:

Watched video together - Embracing Algorithms -
Learned about tripple slashes in Xcode /// for documentation that's included in .swiftdoc and displayed within xcode. Look through swift guides Looked at big O notation and talked about the different complexities

Questions for next meeting:

Unit Testing
  • Wrote some tests for MCTJSON JSONHelper class
  • Write tests for any public interfaces!
Task to work on together
  • What's the correct way to disable the header highlight in on a dashboard card based on data. (just an exercise)


  • Any new file should be written in Swift

[self.orderedHouseholdMembers filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id _Nullable evaluatedObject, __unused NSDictionary<NSString *,id> * _Nullable bindings) {

Becoming a better programmer Models of learning:

Try Fastlane for build automation.

NS namespace belongs to NextStep, a company Apple bought and based MacOS/iOS on. Example NSObject. Start watching Core Data course:

Course Notes
  • Core Data - Data layer management framework

    • Data Structure, relationships, changing models and updating UI when models change.
    • Core Data is a framework/library/bundle of code
    • referential integrity - Core Data uses two-sided relationships. Core Data traverses the web of entity class instances (object graph) and makes sure all affected references are updated.
    • Deleteion Rules:
      • Cascade: Deleteing a notebook will causes all of the notes to be deleted
      • Nullify means the relationship will simply be removed, but the referenced notebook remains
  • Faults - relationships are not immediately loaded. Instead, Core Data has a mechanism called faulting. Faulting allows any attribute or relationship to be in a special state where it is promised to load when needed. When you fetch a managed object, its relationships are initially represented as faults.

Core Data Stack
  • 1 or more Managed Object Context(s)

    • Scratch pad to edit or update NSManagedObjects or create new ones
  • Managed Object Model

    • Describes data structure and relationships - .xcdatamodeld file
  • Persistent Store Coordinator

    • Connects to 1 or more persistant stores. Translates store objects into managed objects, or managed objects into stored objects.
    • A mediator for turning persisted data into managed objects and turning managed objects into persisted data
  • Persistent Container

    • set up the rest of stact
    • provie useful methods for working with contexts
  • Core data migration. .xcmappingmodel

    • automatic (light weight) vs custom
    • custom: subclass NSEntityMigrationPolicy and use createDestinationInstances(forSource sInstance: NSManagedObject, in mapping: NSEntityMapping, manager: NSMigrationManager)
    • Services doesn't use a migration/merge policy. Instead builds the stack from scratch.
  • Concurrency:

  • main queue vs private queue

  • Concurrency Types:

  • NSPrivateQueueConcurrencyType: Specifies that the context will be associated with a private dispatch queue

  • NSMainQueueConcurrencyType: Specifies that the context will be associated with the main queue.

  • Merge Policies

    Default policy for all managed object contexts.
    A policy that merges conflicts between the persistent store's version of the object and the current in-memory version by individual property, with the in-memory changes trumping external changes.
    A policy that merges conflicts between the persistent store's version of the object and the current in-memory version by individual property, with the external changes trumping in-memory changes.
    A policy that merges conflicts between the persistent store's version of the object and the current in-memory version by pushing the entire in-memory object to the persistent store.
    A policy that merges conflicts between the persistent store's version of the object and the current in-memory version by discarding all state for the changed objects in conflict.
  • MCTObjectContext.m line 291:
+ (NSDictionary *)defaultPersistentStoreOptions {
    return @{
             NSMigratePersistentStoresAutomaticallyOption: @YES,
             NSInferMappingModelAutomaticallyOption: @YES

Transpose Quick View add Minor Support

Talked with James about how to tackle this card: Solution:

Check out this crash report together:

Review this together:

Check out this together:

Can't get fastlane working for Services


▸ Signing /Users/erikbye/Library/Developer/Xcode/DerivedData/Services-awpfsigwemreoghcurxsonpypbpz/Build/Intermediates.noindex/ArchiveIntermediates/Services/InstallationBuildProductsLocation/Applications/
▸ Touching
▸ Archive Succeeded
[16:11:20]: Exit status: 1

|            Build environment            |
| xcode_path    | /Applications/ |
| gym_version   | 2.115.0                 |
| export_method | app-store               |
| sdk           | iPhoneOS12.1.sdk        |

[16:11:20]: ▸ Check dependencies
[16:11:20]: ▸ Code Signing Error: No profiles for 'com.ministrycentered.PlanningCenter.ServicesSchedule' were found:  Xcode couldn't find any iOS App Development provisioning profiles matching 'com.ministrycentered.PlanningCenter.ServicesSchedule'. Automatic signing is disabled and unable to generate a profile. To enable automatic signing, pass -allowProvisioningUpdates to xcodebuild.
[16:11:20]: ▸ Swift 3 mode has been deprecated and will be removed in a later version of Xcode. Please migrate "Services Schedule" to Swift 4.2 using "Convert > To Current Swift Syntax…" in the Edit menu.
[16:11:20]: ▸ Swift 3 mode has been deprecated and will be removed in a later version of Xcode. Please migrate "Services Schedule" to Swift 4.2 using "Convert > To Current Swift Syntax…" in the Edit menu.
[16:11:20]: ▸ Code Signing Error: Code signing is required for product type 'App Extension' in SDK 'iOS 12.1'
[16:11:20]: ⬆️  Check out the few lines of raw `xcodebuild` output above for potential hints on how to solve this error
[16:11:20]: 📋  For the complete and more detailed error log, check the full log at:
[16:11:20]: 📋  /Users/erikbye/Library/Logs/gym/Services-Services.log
[16:11:20]: Looks like fastlane ran into a build/archive error with your project
[16:11:20]: It's hard to tell what's causing the error, so we wrote some guides on how
[16:11:20]: to troubleshoot build and signing issues:
[16:11:20]: Before submitting an issue on GitHub, please follow the guide above and make
[16:11:20]: sure your project is set up correctly.
[16:11:20]: fastlane uses `xcodebuild` commands to generate your binary, you can see the
[16:11:20]: the full commands printed out in yellow in the above log.
[16:11:20]: Make sure to inspect the output above, as usually you'll find more error information there

Fixed! ^

  • Needed to manually set the profiles to the ones generated by fastlane's Match service.

Design Patterns!

  • I want to get better at them. I want to talk about them and better understand how and why to use them. I know all the terms needed to program, but I don't use them often enough to combine all the pieces together.

  • Talk about push notification bug together. Pair Programming!

Notes for next meeting

  • Analyize an open source project together
  • Find a list of programming terms and talk through each one.
You can’t perform that action at this time.