From e5293b0064f5f68d1afbb30dc38c588e6e895d2f Mon Sep 17 00:00:00 2001 From: Ben Hakes Date: Thu, 6 Dec 2018 15:08:23 -0600 Subject: [PATCH 01/10] add code from Detail project --- .../ios-firebase.xcodeproj/project.pbxproj | 341 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 5161 bytes .../xcschemes/xcschememanagement.plist | 14 + ios-firebase/ios-firebase/.DS_Store | Bin 0 -> 6148 bytes ios-firebase/ios-firebase/AppDelegate.swift | 46 +++ .../AppIcon.appiconset/Contents.json | 98 +++++ .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 ++ .../ios-firebase/Base.lproj/Main.storyboard | 24 ++ ios-firebase/ios-firebase/Info.plist | 45 +++ ios-firebase/ios-firebase/Model/Model.swift | 22 ++ .../Model/ModelUpdateClient.swift | 5 + ios-firebase/ios-firebase/Model/Person.swift | 10 + .../ios-firebase/Networking/Firebase.swift | 146 ++++++++ .../Networking/FirebaseItem.swift | 5 + .../ios-firebase/Resources/EntryCell.xib | 88 +++++ .../Resources/LaunchScreen.storyboard | 25 ++ .../ios-firebase/Resources/Main.storyboard | 236 ++++++++++++ .../ios-firebase/Resources/PersonCell.xib | 53 +++ .../ios-firebase/ViewController.swift | 20 + .../DetailViewController.swift | 24 ++ .../ViewControllerAndCells/EntryCell.swift | 18 + .../ViewControllerAndCells/PersonCell.swift | 8 + .../TableViewController.swift | 64 ++++ 26 files changed, 1338 insertions(+) create mode 100644 ios-firebase/ios-firebase.xcodeproj/project.pbxproj create mode 100644 ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcuserdata/bhhakes.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ios-firebase/ios-firebase.xcodeproj/xcuserdata/bhhakes.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ios-firebase/ios-firebase/.DS_Store create mode 100644 ios-firebase/ios-firebase/AppDelegate.swift create mode 100644 ios-firebase/ios-firebase/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios-firebase/ios-firebase/Assets.xcassets/Contents.json create mode 100644 ios-firebase/ios-firebase/Base.lproj/LaunchScreen.storyboard create mode 100644 ios-firebase/ios-firebase/Base.lproj/Main.storyboard create mode 100644 ios-firebase/ios-firebase/Info.plist create mode 100644 ios-firebase/ios-firebase/Model/Model.swift create mode 100644 ios-firebase/ios-firebase/Model/ModelUpdateClient.swift create mode 100644 ios-firebase/ios-firebase/Model/Person.swift create mode 100644 ios-firebase/ios-firebase/Networking/Firebase.swift create mode 100644 ios-firebase/ios-firebase/Networking/FirebaseItem.swift create mode 100644 ios-firebase/ios-firebase/Resources/EntryCell.xib create mode 100644 ios-firebase/ios-firebase/Resources/LaunchScreen.storyboard create mode 100644 ios-firebase/ios-firebase/Resources/Main.storyboard create mode 100644 ios-firebase/ios-firebase/Resources/PersonCell.xib create mode 100644 ios-firebase/ios-firebase/ViewController.swift create mode 100644 ios-firebase/ios-firebase/ViewControllerAndCells/DetailViewController.swift create mode 100644 ios-firebase/ios-firebase/ViewControllerAndCells/EntryCell.swift create mode 100644 ios-firebase/ios-firebase/ViewControllerAndCells/PersonCell.swift create mode 100644 ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift diff --git a/ios-firebase/ios-firebase.xcodeproj/project.pbxproj b/ios-firebase/ios-firebase.xcodeproj/project.pbxproj new file mode 100644 index 0000000..a12237b --- /dev/null +++ b/ios-firebase/ios-firebase.xcodeproj/project.pbxproj @@ -0,0 +1,341 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + D13D357B21B9C57800E46F00 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D13D357A21B9C57800E46F00 /* AppDelegate.swift */; }; + D13D357D21B9C57800E46F00 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D13D357C21B9C57800E46F00 /* ViewController.swift */; }; + D13D358021B9C57800E46F00 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D13D357E21B9C57800E46F00 /* Main.storyboard */; }; + D13D358221B9C57900E46F00 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D13D358121B9C57900E46F00 /* Assets.xcassets */; }; + D13D358521B9C57900E46F00 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D13D358321B9C57900E46F00 /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + D13D357721B9C57800E46F00 /* ios-firebase.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ios-firebase.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + D13D357A21B9C57800E46F00 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + D13D357C21B9C57800E46F00 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + D13D357F21B9C57800E46F00 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + D13D358121B9C57900E46F00 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + D13D358421B9C57900E46F00 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + D13D358621B9C57900E46F00 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D13D357421B9C57800E46F00 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + D13D356E21B9C57800E46F00 = { + isa = PBXGroup; + children = ( + D13D357921B9C57800E46F00 /* ios-firebase */, + D13D357821B9C57800E46F00 /* Products */, + ); + sourceTree = ""; + }; + D13D357821B9C57800E46F00 /* Products */ = { + isa = PBXGroup; + children = ( + D13D357721B9C57800E46F00 /* ios-firebase.app */, + ); + name = Products; + sourceTree = ""; + }; + D13D357921B9C57800E46F00 /* ios-firebase */ = { + isa = PBXGroup; + children = ( + D13D357A21B9C57800E46F00 /* AppDelegate.swift */, + D13D357C21B9C57800E46F00 /* ViewController.swift */, + D13D357E21B9C57800E46F00 /* Main.storyboard */, + D13D358121B9C57900E46F00 /* Assets.xcassets */, + D13D358321B9C57900E46F00 /* LaunchScreen.storyboard */, + D13D358621B9C57900E46F00 /* Info.plist */, + ); + path = "ios-firebase"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + D13D357621B9C57800E46F00 /* ios-firebase */ = { + isa = PBXNativeTarget; + buildConfigurationList = D13D358921B9C57900E46F00 /* Build configuration list for PBXNativeTarget "ios-firebase" */; + buildPhases = ( + D13D357321B9C57800E46F00 /* Sources */, + D13D357421B9C57800E46F00 /* Frameworks */, + D13D357521B9C57800E46F00 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "ios-firebase"; + productName = "ios-firebase"; + productReference = D13D357721B9C57800E46F00 /* ios-firebase.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D13D356F21B9C57800E46F00 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1010; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = "Benjamin Hakes"; + TargetAttributes = { + D13D357621B9C57800E46F00 = { + CreatedOnToolsVersion = 10.1; + }; + }; + }; + buildConfigurationList = D13D357221B9C57800E46F00 /* Build configuration list for PBXProject "ios-firebase" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = D13D356E21B9C57800E46F00; + productRefGroup = D13D357821B9C57800E46F00 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D13D357621B9C57800E46F00 /* ios-firebase */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D13D357521B9C57800E46F00 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D13D358521B9C57900E46F00 /* LaunchScreen.storyboard in Resources */, + D13D358221B9C57900E46F00 /* Assets.xcassets in Resources */, + D13D358021B9C57800E46F00 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D13D357321B9C57800E46F00 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D13D357D21B9C57800E46F00 /* ViewController.swift in Sources */, + D13D357B21B9C57800E46F00 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + D13D357E21B9C57800E46F00 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + D13D357F21B9C57800E46F00 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + D13D358321B9C57900E46F00 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + D13D358421B9C57900E46F00 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + D13D358721B9C57900E46F00 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + D13D358821B9C57900E46F00 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + D13D358A21B9C57900E46F00 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = S5U94G8XN2; + INFOPLIST_FILE = "ios-firebase/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.mettabits.ios-firebase"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + D13D358B21B9C57900E46F00 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = S5U94G8XN2; + INFOPLIST_FILE = "ios-firebase/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.mettabits.ios-firebase"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D13D357221B9C57800E46F00 /* Build configuration list for PBXProject "ios-firebase" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D13D358721B9C57900E46F00 /* Debug */, + D13D358821B9C57900E46F00 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D13D358921B9C57900E46F00 /* Build configuration list for PBXNativeTarget "ios-firebase" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D13D358A21B9C57900E46F00 /* Debug */, + D13D358B21B9C57900E46F00 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D13D356F21B9C57800E46F00 /* Project object */; +} diff --git a/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..dc70193 --- /dev/null +++ b/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcuserdata/bhhakes.xcuserdatad/UserInterfaceState.xcuserstate b/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcuserdata/bhhakes.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..00fa922fe84d79a58ceb37bebd26a34284b4a45e GIT binary patch literal 5161 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 J_R%DL@P8v5 + + + + SchemeUserState + + ios-firebase.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/ios-firebase/ios-firebase/.DS_Store b/ios-firebase/ios-firebase/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..35400255c6ef794ebf0dd922716bfbf3437bf3e8 GIT binary patch literal 6148 zcmeHKyGjH>5Ukb<4oxmJoG%dkgJC(pz#s5&CbF>NVZPCQm!D?!1M%215lo~Sx@)Gl zYlo>|dmDfa@4Fjd17J;e#KFVT{JHzW&MIR>I^S`P5wCc|gqKD2>4bAHFyH}uJb&l! z_D|#EG>xZe%1Qw#AO)m=6p#YHRKR;LZGD-jC*bC>x_;fJD2tZsh z9maLc62#^SVlSK%nW0%yiAl8@F)ZoKx2o%fb7InAHGEi|Y&D@+oX+>RD2Me#MJXT! zjukl1?Z*56E&Yf2|Cpqm6p#Y{N&#DK@3sT4RK0a^Iq$WNeoyzB54s!IL1Bn?OpJES gjkn{gD9XC#Yd-IVb7Ih$4?0ml1Fnlq3jDPKpWLDq4*&oF literal 0 HcmV?d00001 diff --git a/ios-firebase/ios-firebase/AppDelegate.swift b/ios-firebase/ios-firebase/AppDelegate.swift new file mode 100644 index 0000000..6772e0c --- /dev/null +++ b/ios-firebase/ios-firebase/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// ios-firebase +// +// Created by Benjamin Hakes on 12/6/18. +// Copyright © 2018 Benjamin Hakes. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/ios-firebase/ios-firebase/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios-firebase/ios-firebase/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/ios-firebase/ios-firebase/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios-firebase/ios-firebase/Assets.xcassets/Contents.json b/ios-firebase/ios-firebase/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/ios-firebase/ios-firebase/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios-firebase/ios-firebase/Base.lproj/LaunchScreen.storyboard b/ios-firebase/ios-firebase/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..bfa3612 --- /dev/null +++ b/ios-firebase/ios-firebase/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios-firebase/ios-firebase/Base.lproj/Main.storyboard b/ios-firebase/ios-firebase/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f1bcf38 --- /dev/null +++ b/ios-firebase/ios-firebase/Base.lproj/Main.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios-firebase/ios-firebase/Info.plist b/ios-firebase/ios-firebase/Info.plist new file mode 100644 index 0000000..16be3b6 --- /dev/null +++ b/ios-firebase/ios-firebase/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ios-firebase/ios-firebase/Model/Model.swift b/ios-firebase/ios-firebase/Model/Model.swift new file mode 100644 index 0000000..55fb185 --- /dev/null +++ b/ios-firebase/ios-firebase/Model/Model.swift @@ -0,0 +1,22 @@ +import Foundation + +class Model { + static let shared = Model() + private init() {} + var delegate: ModelUpdateClient? + + private var persons: [Person] = [] + + func count() -> Int { + return persons.count + } + + func person(forIndex index: Int) -> Person { + return persons[index] + } + + func add(person: Person) { + persons.append(person) + delegate?.modelDidUpdate() + } +} diff --git a/ios-firebase/ios-firebase/Model/ModelUpdateClient.swift b/ios-firebase/ios-firebase/Model/ModelUpdateClient.swift new file mode 100644 index 0000000..6268cd4 --- /dev/null +++ b/ios-firebase/ios-firebase/Model/ModelUpdateClient.swift @@ -0,0 +1,5 @@ +import Foundation + +protocol ModelUpdateClient { + func modelDidUpdate() +} diff --git a/ios-firebase/ios-firebase/Model/Person.swift b/ios-firebase/ios-firebase/Model/Person.swift new file mode 100644 index 0000000..ccf0dfc --- /dev/null +++ b/ios-firebase/ios-firebase/Model/Person.swift @@ -0,0 +1,10 @@ +import Foundation + +class Person { + var name: String + var cohort: String + + init(name: String, cohort: String) { + (self.name, self.cohort) = (name, cohort) + } +} diff --git a/ios-firebase/ios-firebase/Networking/Firebase.swift b/ios-firebase/ios-firebase/Networking/Firebase.swift new file mode 100644 index 0000000..d1f857c --- /dev/null +++ b/ios-firebase/ios-firebase/Networking/Firebase.swift @@ -0,0 +1,146 @@ +import Foundation + +/* + READ <- start the application + + POST <- create, creating a new record, Firebase will return a new record identifier + PUT <- update a specific record + DELETE <- delete a specific record + */ + + +class Firebase { + static var baseURL: URL! { return URL(string: "https://put-and-post.firebaseio.com/") } + + static func requestURL(_ method: String, for recordIdentifier: String = "unknownid") -> URL { + switch method { + case "POST": + // You post to the main DB. It will return a new record identifier + return baseURL.appendingPathExtension("json") + case "DELETE", "PUT", "GET": + // These all work on individual records, and you need to use the + // record identifier in your URL with one exception, which is when + // all the records at once, in which case, you do not need the record + // identifier. + return baseURL + .appendingPathComponent(recordIdentifier) + .appendingPathExtension("json") + default: + fatalError("Unknown request method: \(method)") + } + } + + // Handle a single request: meant for DELETE, PUT, POST. + // If you were doing a GET, you'd want to pass back a record and not a success token + static func processRequest( + method: String, + for item: Item, + with completion: @escaping (_ success: Bool) -> Void = { _ in } + ) { + + // Fetch appropriate request URL customized to method + var request = URLRequest(url: requestURL(method, for: item.recordIdentifier)) + request.httpMethod = method + + // Encode this record + do { + request.httpBody = try JSONEncoder().encode(item) + } catch { + NSLog("Unable to encode \(item): \(error)") + completion(false) + return + } + + // Create data task to perform request + let dataTask = URLSession.shared.dataTask(with: request) { data, _ , error in + + // Fail on error + if let error = error { + NSLog("Server \(method) error: \(error)") + completion(false) + return + } + + // Handle PUT, GET, DELETE and leave + guard method == "POST" else { + completion(true) + return + } + + // Process POST requests + + // Fetch identifier from POST + guard let data = data else { + NSLog("Invalid server response data") + completion(false) + return + } + + do { + + // POST request returns `["name": recordIdentifier]`. Store the + // record identifier + let nameDict = try JSONDecoder().decode([String: String].self, from: data) + guard let name = nameDict["name"] else { + completion(false) + return + } + + // Update record and store that name. POST is now successful + // and includes the recordIdentifier as part of the item record. + item.recordIdentifier = name + processRequest(method: "PUT", for: item) + completion(true) + + } catch { + + NSLog("Error decoding JSON response: \(error)") + completion(false) + return + } + } + + dataTask.resume() + } + + static func delete(item: Item, completion: @escaping (_ success: Bool) -> Void = { _ in }) { + processRequest(method: "DELETE", for: item, with: completion) + } + + static func save(item: Item, completion: @escaping (_ success: Bool) -> Void = { _ in }) { + switch item.recordIdentifier.isEmpty { + case true: // POST, new record + processRequest(method: "POST", for: item, with: completion) + case false: // PUT, existing record + processRequest(method: "PUT", for: item, with: completion) + } + } + + // Fetch all records and pass them to sender via completion handler + static func fetchRecords(completion: @escaping ([Item]?) -> Void) { + let requestURL = baseURL.appendingPathExtension("json") + let dataTask = URLSession.shared.dataTask(with: requestURL) { data, _, error in + + guard error == nil, let data = data else { + // Guaranteed to work + if let error = error { + NSLog("Error fetching entries: \(error)") + } + completion(nil) + return + } + + do { + let recordDict = try JSONDecoder().decode([String: Item].self, from:data) + for (key, value) in recordDict { value.recordIdentifier = key } // pure paranoia + let records = recordDict.map({ $0.value }) // This converts the [[id: item]] array of dictionary entries into an array of items + completion(records) + } catch { + NSLog("Error decoding received data: \(error)") + completion([]) + } + } + + dataTask.resume() + } +} diff --git a/ios-firebase/ios-firebase/Networking/FirebaseItem.swift b/ios-firebase/ios-firebase/Networking/FirebaseItem.swift new file mode 100644 index 0000000..5c9beb4 --- /dev/null +++ b/ios-firebase/ios-firebase/Networking/FirebaseItem.swift @@ -0,0 +1,5 @@ +import Foundation + +protocol FirebaseItem: class { + var recordIdentifier: String {get set} +} diff --git a/ios-firebase/ios-firebase/Resources/EntryCell.xib b/ios-firebase/ios-firebase/Resources/EntryCell.xib new file mode 100644 index 0000000..52c04e8 --- /dev/null +++ b/ios-firebase/ios-firebase/Resources/EntryCell.xib @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios-firebase/ios-firebase/Resources/LaunchScreen.storyboard b/ios-firebase/ios-firebase/Resources/LaunchScreen.storyboard new file mode 100644 index 0000000..bfa3612 --- /dev/null +++ b/ios-firebase/ios-firebase/Resources/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios-firebase/ios-firebase/Resources/Main.storyboard b/ios-firebase/ios-firebase/Resources/Main.storyboard new file mode 100644 index 0000000..efdd8b3 --- /dev/null +++ b/ios-firebase/ios-firebase/Resources/Main.storyboard @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios-firebase/ios-firebase/Resources/PersonCell.xib b/ios-firebase/ios-firebase/Resources/PersonCell.xib new file mode 100644 index 0000000..c536c7c --- /dev/null +++ b/ios-firebase/ios-firebase/Resources/PersonCell.xib @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios-firebase/ios-firebase/ViewController.swift b/ios-firebase/ios-firebase/ViewController.swift new file mode 100644 index 0000000..3f7d2d8 --- /dev/null +++ b/ios-firebase/ios-firebase/ViewController.swift @@ -0,0 +1,20 @@ +// +// ViewController.swift +// ios-firebase +// +// Created by Benjamin Hakes on 12/6/18. +// Copyright © 2018 Benjamin Hakes. All rights reserved. +// + +import UIKit + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view, typically from a nib. + } + + +} + diff --git a/ios-firebase/ios-firebase/ViewControllerAndCells/DetailViewController.swift b/ios-firebase/ios-firebase/ViewControllerAndCells/DetailViewController.swift new file mode 100644 index 0000000..996820f --- /dev/null +++ b/ios-firebase/ios-firebase/ViewControllerAndCells/DetailViewController.swift @@ -0,0 +1,24 @@ +import UIKit + +class DetailViewController: UIViewController { + var person: Person? + + @IBOutlet weak var nameField: UITextField! + @IBOutlet weak var cohortField: UITextField! + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + guard let person = person else { return } + nameField.text = person.name + cohortField.text = person.cohort + } + + @IBAction func save(_ sender: Any) { + guard let person = person else { return } + guard let name = nameField.text, !name.isEmpty else { return } + person.name = name + person.cohort = cohortField.text ?? "" + navigationController?.popViewController(animated: true) + } +} diff --git a/ios-firebase/ios-firebase/ViewControllerAndCells/EntryCell.swift b/ios-firebase/ios-firebase/ViewControllerAndCells/EntryCell.swift new file mode 100644 index 0000000..f8b8d39 --- /dev/null +++ b/ios-firebase/ios-firebase/ViewControllerAndCells/EntryCell.swift @@ -0,0 +1,18 @@ +import UIKit + +class EntryCell: UITableViewCell { + static let reuseIdentifier = "entry cell" + + @IBOutlet weak var nameField: UITextField! + + @IBOutlet weak var cohortField: UITextField! + + @IBAction func add(_ sender: Any) { + guard let name = nameField.text, !name.isEmpty else { return } + let cohort = cohortField.text ?? "" + let person = Person(name: name, cohort: cohort) + Model.shared.add(person: person) + nameField.text = nil + cohortField.text = nil + } +} diff --git a/ios-firebase/ios-firebase/ViewControllerAndCells/PersonCell.swift b/ios-firebase/ios-firebase/ViewControllerAndCells/PersonCell.swift new file mode 100644 index 0000000..57762b0 --- /dev/null +++ b/ios-firebase/ios-firebase/ViewControllerAndCells/PersonCell.swift @@ -0,0 +1,8 @@ +import UIKit + +class PersonCell: UITableViewCell { + static let reuseIdentifier = "person cell" + + @IBOutlet weak var nameLabel: UILabel! + @IBOutlet weak var cohortLabel: UILabel! +} diff --git a/ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift b/ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift new file mode 100644 index 0000000..84a2ab5 --- /dev/null +++ b/ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift @@ -0,0 +1,64 @@ +import UIKit + +class TableViewController: UITableViewController, ModelUpdateClient { + override func numberOfSections(in tableView: UITableView) -> Int { + return 2 + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + switch section { + case 0: + return 1 + case 1: + return Model.shared.count() + default: + fatalError("Illegal section") + } + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + if indexPath.section == 0 { + // handle the single entry cell + // return it + guard let cell = tableView.dequeueReusableCell(withIdentifier: EntryCell.reuseIdentifier, for: indexPath) as? EntryCell + else { fatalError("Unable to dequeue entry cell") } + + cell.nameField.text = "" // Coder paranoia + cell.cohortField.text = "" + + return cell + } + + // do anything related to person cell + guard let cell = tableView.dequeueReusableCell(withIdentifier: PersonCell.reuseIdentifier, for: indexPath) as? PersonCell + else { fatalError("Unable to dequeue person cell") } + + let person = Model.shared.person(forIndex: indexPath.row) + cell.nameLabel.text = person.name + cell.cohortLabel.text = person.cohort + return cell + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + tableView.reloadData() + } + + override func viewDidLoad() { + super.viewDidLoad() + Model.shared.delegate = self + } + + func modelDidUpdate() { + tableView.reloadData() + } + + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + guard let indexPath = tableView.indexPathForSelectedRow + else { return } + guard let destination = segue.destination as? DetailViewController + else { return } + + destination.person = Model.shared.person(forIndex: indexPath.row) + } +} From cd670f3314e3489e5c30860e77d9a40df0bfa7a2 Mon Sep 17 00:00:00 2001 From: Ben Hakes Date: Thu, 6 Dec 2018 15:20:38 -0600 Subject: [PATCH 02/10] update person class to conform to FirebaseItem protocol and by Codable --- ios-firebase/ios-firebase/Model/Person.swift | 4 +++- ios-firebase/ios-firebase/Networking/Firebase.swift | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ios-firebase/ios-firebase/Model/Person.swift b/ios-firebase/ios-firebase/Model/Person.swift index ccf0dfc..6c8f174 100644 --- a/ios-firebase/ios-firebase/Model/Person.swift +++ b/ios-firebase/ios-firebase/Model/Person.swift @@ -1,8 +1,10 @@ import Foundation -class Person { +class Person: Codable, FirebaseItem { + var name: String var cohort: String + var recordIdentifier: String = "" init(name: String, cohort: String) { (self.name, self.cohort) = (name, cohort) diff --git a/ios-firebase/ios-firebase/Networking/Firebase.swift b/ios-firebase/ios-firebase/Networking/Firebase.swift index d1f857c..9758384 100644 --- a/ios-firebase/ios-firebase/Networking/Firebase.swift +++ b/ios-firebase/ios-firebase/Networking/Firebase.swift @@ -10,7 +10,7 @@ import Foundation class Firebase { - static var baseURL: URL! { return URL(string: "https://put-and-post.firebaseio.com/") } + static var baseURL: URL! { return URL(string: "https://new-project-69d95.firebaseio.com/") } static func requestURL(_ method: String, for recordIdentifier: String = "unknownid") -> URL { switch method { From 44c690c2e97489af36b92fddeff0cc3564e1fff2 Mon Sep 17 00:00:00 2001 From: Ben Hakes Date: Thu, 6 Dec 2018 15:26:38 -0600 Subject: [PATCH 03/10] add Questions.md file --- ios-firebase/.DS_Store | Bin 0 -> 6148 bytes ios-firebase/Questions.md | 19 +++ .../ios-firebase.xcodeproj/project.pbxproj | 115 +++++++++++++----- .../UserInterfaceState.xcuserstate | Bin 5161 -> 22847 bytes .../TableViewController.swift | 3 + 5 files changed, 106 insertions(+), 31 deletions(-) create mode 100644 ios-firebase/.DS_Store create mode 100644 ios-firebase/Questions.md diff --git a/ios-firebase/.DS_Store b/ios-firebase/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7b85362b8c491178159d0038bdfd1427052c67f2 GIT binary patch literal 6148 zcmeHKO-jR15dL1R5Ya_f;xY@j3cW!r@dUkqCaHgxkmexV%Pb)=X~ZmIr^q)Hr=dg*b#cUS8cur}{j!Li zqK3o8;lsr*yEvh^@O9=-gF9TNXsa<`46HJ+qmLu$|L5!H|J5LSG6sx+tzy6p^JzZe zkz#M{9Zq^}O1+?ph+n6;2;nBQV){xeKB5MpJ(UeHi`XgBLa{#rfd*TQfj?#78*Keh AX#fBK literal 0 HcmV?d00001 diff --git a/ios-firebase/Questions.md b/ios-firebase/Questions.md new file mode 100644 index 0000000..9ad1dc3 --- /dev/null +++ b/ios-firebase/Questions.md @@ -0,0 +1,19 @@ +# Questions: + +### What is a RESTful interface? When do you use it? What are its characteristics? + +### What is the difference between POST and PUT? +POST: Create (each time creates a new record). Post ALWAYS creates a new item. +PUT: Update (Don’t confuse this with POST), to a specific record id, replacing the data for that record. + +### How does the record ID work in Firebase? Why does it take two steps to save a record (first POST then PUT) in our app? Why does the FirebaseItem protocol even exist? + +### Explain what a generic type is and what advantages it offers. + +### What does a URLRequest do? When do you need one and when can you just use a URL? + +### What is the role of a URL session? How does it work? + +### What are completion handlers? Why use completion handlers? What advantages do they provide? + +### Explain at least three strategies that promote code reuse that we used in today's project diff --git a/ios-firebase/ios-firebase.xcodeproj/project.pbxproj b/ios-firebase/ios-firebase.xcodeproj/project.pbxproj index a12237b..8b714fa 100644 --- a/ios-firebase/ios-firebase.xcodeproj/project.pbxproj +++ b/ios-firebase/ios-firebase.xcodeproj/project.pbxproj @@ -8,20 +8,40 @@ /* Begin PBXBuildFile section */ D13D357B21B9C57800E46F00 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D13D357A21B9C57800E46F00 /* AppDelegate.swift */; }; - D13D357D21B9C57800E46F00 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D13D357C21B9C57800E46F00 /* ViewController.swift */; }; - D13D358021B9C57800E46F00 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D13D357E21B9C57800E46F00 /* Main.storyboard */; }; D13D358221B9C57900E46F00 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D13D358121B9C57900E46F00 /* Assets.xcassets */; }; - D13D358521B9C57900E46F00 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D13D358321B9C57900E46F00 /* LaunchScreen.storyboard */; }; + D13D358F21B9C66100E46F00 /* Firebase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D13D358E21B9C66100E46F00 /* Firebase.swift */; }; + D13D359121B9C66E00E46F00 /* FirebaseItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D13D359021B9C66E00E46F00 /* FirebaseItem.swift */; }; + D13D359721B9C6EE00E46F00 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D13D359621B9C6EE00E46F00 /* Main.storyboard */; }; + D13D359B21B9C6F900E46F00 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D13D359821B9C6F900E46F00 /* LaunchScreen.storyboard */; }; + D13D359C21B9C6F900E46F00 /* PersonCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = D13D359921B9C6F900E46F00 /* PersonCell.xib */; }; + D13D359D21B9C6F900E46F00 /* EntryCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = D13D359A21B9C6F900E46F00 /* EntryCell.xib */; }; + D13D35A121B9C70400E46F00 /* ModelUpdateClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = D13D359E21B9C70400E46F00 /* ModelUpdateClient.swift */; }; + D13D35A221B9C70400E46F00 /* Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = D13D359F21B9C70400E46F00 /* Model.swift */; }; + D13D35A321B9C70400E46F00 /* Person.swift in Sources */ = {isa = PBXBuildFile; fileRef = D13D35A021B9C70400E46F00 /* Person.swift */; }; + D13D35A821B9C71900E46F00 /* PersonCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D13D35A421B9C71900E46F00 /* PersonCell.swift */; }; + D13D35A921B9C71900E46F00 /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D13D35A521B9C71900E46F00 /* DetailViewController.swift */; }; + D13D35AA21B9C71900E46F00 /* EntryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D13D35A621B9C71900E46F00 /* EntryCell.swift */; }; + D13D35AB21B9C71900E46F00 /* TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D13D35A721B9C71900E46F00 /* TableViewController.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ D13D357721B9C57800E46F00 /* ios-firebase.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ios-firebase.app"; sourceTree = BUILT_PRODUCTS_DIR; }; D13D357A21B9C57800E46F00 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - D13D357C21B9C57800E46F00 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - D13D357F21B9C57800E46F00 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; D13D358121B9C57900E46F00 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - D13D358421B9C57900E46F00 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; D13D358621B9C57900E46F00 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D13D358E21B9C66100E46F00 /* Firebase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Firebase.swift; sourceTree = ""; }; + D13D359021B9C66E00E46F00 /* FirebaseItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FirebaseItem.swift; sourceTree = ""; }; + D13D359621B9C6EE00E46F00 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; + D13D359821B9C6F900E46F00 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; + D13D359921B9C6F900E46F00 /* PersonCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PersonCell.xib; sourceTree = ""; }; + D13D359A21B9C6F900E46F00 /* EntryCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = EntryCell.xib; sourceTree = ""; }; + D13D359E21B9C70400E46F00 /* ModelUpdateClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ModelUpdateClient.swift; sourceTree = ""; }; + D13D359F21B9C70400E46F00 /* Model.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Model.swift; sourceTree = ""; }; + D13D35A021B9C70400E46F00 /* Person.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Person.swift; sourceTree = ""; }; + D13D35A421B9C71900E46F00 /* PersonCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PersonCell.swift; sourceTree = ""; }; + D13D35A521B9C71900E46F00 /* DetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailViewController.swift; sourceTree = ""; }; + D13D35A621B9C71900E46F00 /* EntryCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EntryCell.swift; sourceTree = ""; }; + D13D35A721B9C71900E46F00 /* TableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewController.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -55,15 +75,57 @@ isa = PBXGroup; children = ( D13D357A21B9C57800E46F00 /* AppDelegate.swift */, - D13D357C21B9C57800E46F00 /* ViewController.swift */, - D13D357E21B9C57800E46F00 /* Main.storyboard */, + D13D359521B9C6B400E46F00 /* Networking */, + D13D359421B9C6AC00E46F00 /* Resources */, + D13D359321B9C69E00E46F00 /* ViewControllerAndCells */, + D13D359221B9C69300E46F00 /* Model */, D13D358121B9C57900E46F00 /* Assets.xcassets */, - D13D358321B9C57900E46F00 /* LaunchScreen.storyboard */, D13D358621B9C57900E46F00 /* Info.plist */, ); path = "ios-firebase"; sourceTree = ""; }; + D13D359221B9C69300E46F00 /* Model */ = { + isa = PBXGroup; + children = ( + D13D359F21B9C70400E46F00 /* Model.swift */, + D13D359E21B9C70400E46F00 /* ModelUpdateClient.swift */, + D13D35A021B9C70400E46F00 /* Person.swift */, + ); + path = Model; + sourceTree = ""; + }; + D13D359321B9C69E00E46F00 /* ViewControllerAndCells */ = { + isa = PBXGroup; + children = ( + D13D35A521B9C71900E46F00 /* DetailViewController.swift */, + D13D35A621B9C71900E46F00 /* EntryCell.swift */, + D13D35A421B9C71900E46F00 /* PersonCell.swift */, + D13D35A721B9C71900E46F00 /* TableViewController.swift */, + ); + path = ViewControllerAndCells; + sourceTree = ""; + }; + D13D359421B9C6AC00E46F00 /* Resources */ = { + isa = PBXGroup; + children = ( + D13D359621B9C6EE00E46F00 /* Main.storyboard */, + D13D359A21B9C6F900E46F00 /* EntryCell.xib */, + D13D359821B9C6F900E46F00 /* LaunchScreen.storyboard */, + D13D359921B9C6F900E46F00 /* PersonCell.xib */, + ); + path = Resources; + sourceTree = ""; + }; + D13D359521B9C6B400E46F00 /* Networking */ = { + isa = PBXGroup; + children = ( + D13D358E21B9C66100E46F00 /* Firebase.swift */, + D13D359021B9C66E00E46F00 /* FirebaseItem.swift */, + ); + path = Networking; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -122,9 +184,11 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - D13D358521B9C57900E46F00 /* LaunchScreen.storyboard in Resources */, + D13D359B21B9C6F900E46F00 /* LaunchScreen.storyboard in Resources */, D13D358221B9C57900E46F00 /* Assets.xcassets in Resources */, - D13D358021B9C57800E46F00 /* Main.storyboard in Resources */, + D13D359D21B9C6F900E46F00 /* EntryCell.xib in Resources */, + D13D359C21B9C6F900E46F00 /* PersonCell.xib in Resources */, + D13D359721B9C6EE00E46F00 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -135,32 +199,21 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - D13D357D21B9C57800E46F00 /* ViewController.swift in Sources */, + D13D358F21B9C66100E46F00 /* Firebase.swift in Sources */, + D13D35A121B9C70400E46F00 /* ModelUpdateClient.swift in Sources */, + D13D359121B9C66E00E46F00 /* FirebaseItem.swift in Sources */, + D13D35AB21B9C71900E46F00 /* TableViewController.swift in Sources */, + D13D35A221B9C70400E46F00 /* Model.swift in Sources */, + D13D35AA21B9C71900E46F00 /* EntryCell.swift in Sources */, + D13D35A321B9C70400E46F00 /* Person.swift in Sources */, D13D357B21B9C57800E46F00 /* AppDelegate.swift in Sources */, + D13D35A821B9C71900E46F00 /* PersonCell.swift in Sources */, + D13D35A921B9C71900E46F00 /* DetailViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXVariantGroup section */ - D13D357E21B9C57800E46F00 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - D13D357F21B9C57800E46F00 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - D13D358321B9C57900E46F00 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - D13D358421B9C57900E46F00 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - /* Begin XCBuildConfiguration section */ D13D358721B9C57900E46F00 /* Debug */ = { isa = XCBuildConfiguration; diff --git a/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcuserdata/bhhakes.xcuserdatad/UserInterfaceState.xcuserstate b/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcuserdata/bhhakes.xcuserdatad/UserInterfaceState.xcuserstate index 00fa922fe84d79a58ceb37bebd26a34284b4a45e..5985a49d4c6601e547d4ae44f1b24876525c12cd 100644 GIT binary patch literal 22847 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 diff --git a/ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift b/ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift index 84a2ab5..c75360a 100644 --- a/ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift +++ b/ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift @@ -1,6 +1,9 @@ import UIKit class TableViewController: UITableViewController, ModelUpdateClient { + + + override func numberOfSections(in tableView: UITableView) -> Int { return 2 } From c522611a3a6ddc45abaadeab26a3c07a5c255fc8 Mon Sep 17 00:00:00 2001 From: Ben Hakes Date: Thu, 6 Dec 2018 15:41:42 -0600 Subject: [PATCH 04/10] add new networking-based model methods --- .../UserInterfaceState.xcuserstate | Bin 22847 -> 33946 bytes ios-firebase/ios-firebase/Model/Model.swift | 49 ++++++++++++++++++ .../ViewControllerAndCells/EntryCell.swift | 10 ++-- 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcuserdata/bhhakes.xcuserdatad/UserInterfaceState.xcuserstate b/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcuserdata/bhhakes.xcuserdatad/UserInterfaceState.xcuserstate index 5985a49d4c6601e547d4ae44f1b24876525c12cd..cf51e01a809847c60b20df62f48a6c713cf2553c 100644 GIT binary patch literal 33946 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 Void) { + + let person = person + + // append it to our devices array, updating our local model <-- local + persons.append(person) + + // save it by pushing it to the firebase thing <-- remote + Firebase.save(item: person){ success in + guard success else {return} + DispatchQueue.main.async { completion()} + } + + } + + func deletePerson(at indexPath: IndexPath, completion: @escaping () -> Void) { + // + let person = persons[indexPath.row] + + // + persons.remove(at: indexPath.row) + + // remote + Firebase.delete(item: person){ success in + guard success else {return} + DispatchQueue.main.async { completion()} + } + + } + + + func updatePerson(at indexPath: IndexPath, completion: @escaping () -> Void) { + // + let person = persons[indexPath.row] + + // TODO: do we need this? + //device.uuid = UUID().uuidString + + // remote + Firebase.save(item: person){ success in + guard success else {return} + DispatchQueue.main.async { completion()} + } + + } } diff --git a/ios-firebase/ios-firebase/ViewControllerAndCells/EntryCell.swift b/ios-firebase/ios-firebase/ViewControllerAndCells/EntryCell.swift index f8b8d39..b135852 100644 --- a/ios-firebase/ios-firebase/ViewControllerAndCells/EntryCell.swift +++ b/ios-firebase/ios-firebase/ViewControllerAndCells/EntryCell.swift @@ -8,11 +8,11 @@ class EntryCell: UITableViewCell { @IBOutlet weak var cohortField: UITextField! @IBAction func add(_ sender: Any) { - guard let name = nameField.text, !name.isEmpty else { return } - let cohort = cohortField.text ?? "" - let person = Person(name: name, cohort: cohort) + guard let name = nameField.text, !name.isEmpty else { return } // name has to be filled out + let cohort = cohortField.text ?? "" // cohort is optional + let person = Person(name: name, cohort: cohort) // create a new person instance Model.shared.add(person: person) - nameField.text = nil - cohortField.text = nil + nameField.text = nil // reset the name field to be blank + cohortField.text = nil // reset the cohort field to be blank } } From f405a0c280919635768a647b615d88d8853980c5 Mon Sep 17 00:00:00 2001 From: Ben Hakes Date: Thu, 6 Dec 2018 16:31:40 -0600 Subject: [PATCH 05/10] add table view controller update code --- .../UserInterfaceState.xcuserstate | Bin 33946 -> 33963 bytes ios-firebase/ios-firebase/Model/Model.swift | 6 +++ ios-firebase/ios-firebase/Model/Person.swift | 3 +- .../TableViewController.swift | 36 ++++++++++++++---- 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcuserdata/bhhakes.xcuserdatad/UserInterfaceState.xcuserstate b/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcuserdata/bhhakes.xcuserdatad/UserInterfaceState.xcuserstate index cf51e01a809847c60b20df62f48a6c713cf2553c..43021819c1266e8e17e90806fac9bf3b0f4e523b 100644 GIT binary patch delta 14435 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 OSM~4h96l}t^!-1GGc7y- delta 14509 zcma)?2V9fK|M+vyW`&g<0!c(=lNb`nKvq~`69MbOg%%Z}f_vmSXSG^KO0BipBB*uL z*3s6jb=6r{)mm4z*4DcBs`|et5w+vn-(Ox&B+uP*_x{ZL+&wIxf_*dvoB4r1?)`JaTJJ;vp$tO;9!EyupV)?jO~b=W3sGqwfWhwaA> zUoP{&)Z`z-71`SK?84 zG#-N+@I*WbPsP*lbUXvM;~nrayd1BIq`zTNrDU@1IZvVm=ur_QcAWW!^zfU z8#0QFBjcT93Yki#k?CXxX(cnsEHazSBa6slvJ2Ur>_PS?9b_Fjo}56wLrx>7lXJ=W zpr;L<|YEPw5d6ct+>Ou9S`cQqT{?q_!8a0!eMKw?#P#;nAs86U*sb*>s zwUk;$t)#x7)=+Dyb<}!lGqr`J0S@b(OkCU8f#XPpGHV zpVTuN&=&CX%(%e+t9JJo;J{lbOvp8(wTG?olWP_rF18{Gu?%Lo35t& z(f#QG^gwzTJ)9mvLwX!No}NL^q-W8yX%{_*UO+FVm(ZWlYw54(ujy~-b@V2B2fdTt zMenA+rw`GG=`-|M`W$_p{+Yf+U#0KT_vrf!U@!(}2!>?5m;gq?NEsPpY{Rr=BA7@f ziiu^S$=NOmiGiv0=w zZd-GaX$$Bi*2K1AOI!ioeeoo=*fr9-#w&qs!zQw=S&i$KcV0U!t2@S)UpASE{g$>qp;p zawE%Qi&@@Lo;M;nz-w5@8_FAk*iEd?wcJl8HnWJorTql2p^x=(!z`d!{VBw9L~!A6z2n*)fJrZ=QM#`AK6Ka&6+ugyZacj}It8DMK1^toM!2q@&t8?oXICu@sU?3R8U2K1Lfcw(9jsz?D4tC%|Fb0fe z2eE_E<1d1hK<82l+G<9zLp;vs8Da)E#7r;?%myxYC_9WD&W?C(8sw0!3VE~vndYU= z!9usSMsn8ro2RWqezTspfwz%2mUVlWtB=r>`#H}CtmKUaU-C9o6x!oBr|gXWA6zw{ zM}76sD�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 diff --git a/ios-firebase/ios-firebase/Model/Model.swift b/ios-firebase/ios-firebase/Model/Model.swift index 540f1a3..525d25d 100644 --- a/ios-firebase/ios-firebase/Model/Model.swift +++ b/ios-firebase/ios-firebase/Model/Model.swift @@ -15,8 +15,14 @@ class Model { return persons[index] } + func setPersons(persons: [Person]) { + Model.shared.persons = persons + } + // MARK: Core Database Management Methods + + // TODO: remove this when addNewPerson is complete and working func add(person: Person) { persons.append(person) diff --git a/ios-firebase/ios-firebase/Model/Person.swift b/ios-firebase/ios-firebase/Model/Person.swift index 6c8f174..67b235a 100644 --- a/ios-firebase/ios-firebase/Model/Person.swift +++ b/ios-firebase/ios-firebase/Model/Person.swift @@ -6,7 +6,8 @@ class Person: Codable, FirebaseItem { var cohort: String var recordIdentifier: String = "" - init(name: String, cohort: String) { + init(name: String, cohort: String?) { + let cohort = cohort ?? "" (self.name, self.cohort) = (name, cohort) } } diff --git a/ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift b/ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift index c75360a..79b8ed4 100644 --- a/ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift +++ b/ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift @@ -2,7 +2,30 @@ import UIKit class TableViewController: UITableViewController, ModelUpdateClient { - + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + navigationItem.rightBarButtonItem?.isEnabled = false + let activity = UIActivityIndicatorView() + activity.style = .gray + activity.startAnimating() + navigationItem.titleView = activity + + // Fetch records from Firebase and then reload the table view + // Note: this may be significantly delayed. + Firebase.fetchRecords { persons in + if let persons = persons { + Model.shared.setPersons(persons: persons) + + // Comment this out to show what it looks like while waiting + DispatchQueue.main.async { + self.tableView.reloadData() + self.navigationItem.rightBarButtonItem?.isEnabled = true + self.navigationItem.titleView = nil + self.title = "Person List" + } + } + } + } override func numberOfSections(in tableView: UITableView) -> Int { return 2 @@ -26,8 +49,10 @@ class TableViewController: UITableViewController, ModelUpdateClient { guard let cell = tableView.dequeueReusableCell(withIdentifier: EntryCell.reuseIdentifier, for: indexPath) as? EntryCell else { fatalError("Unable to dequeue entry cell") } - cell.nameField.text = "" // Coder paranoia - cell.cohortField.text = "" + let person = Model.shared.person(forIndex: indexPath.row) + + cell.nameField.text = person.name + cell.cohortField.text = person.cohort return cell } @@ -42,11 +67,6 @@ class TableViewController: UITableViewController, ModelUpdateClient { return cell } - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - tableView.reloadData() - } - override func viewDidLoad() { super.viewDidLoad() Model.shared.delegate = self From e53df66bc79e26f9326a4e0abad0052e3949a308 Mon Sep 17 00:00:00 2001 From: Ben Hakes Date: Thu, 6 Dec 2018 16:32:08 -0600 Subject: [PATCH 06/10] fix label on Model.addNewPerson --- .../UserInterfaceState.xcuserstate | Bin 33963 -> 34062 bytes ios-firebase/ios-firebase/Model/Model.swift | 2 +- .../DetailViewController.swift | 2 ++ 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcuserdata/bhhakes.xcuserdatad/UserInterfaceState.xcuserstate b/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcuserdata/bhhakes.xcuserdatad/UserInterfaceState.xcuserstate index 43021819c1266e8e17e90806fac9bf3b0f4e523b..e2913a4238d3aaed5f59298424f8c859931baf05 100644 GIT binary patch delta 13405 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 Void) { + func addNewPerson(person: Person, completion: @escaping () -> Void) { let person = person diff --git a/ios-firebase/ios-firebase/ViewControllerAndCells/DetailViewController.swift b/ios-firebase/ios-firebase/ViewControllerAndCells/DetailViewController.swift index 996820f..f4cf5c4 100644 --- a/ios-firebase/ios-firebase/ViewControllerAndCells/DetailViewController.swift +++ b/ios-firebase/ios-firebase/ViewControllerAndCells/DetailViewController.swift @@ -17,6 +17,8 @@ class DetailViewController: UIViewController { @IBAction func save(_ sender: Any) { guard let person = person else { return } guard let name = nameField.text, !name.isEmpty else { return } + Model.shared. + person.name = name person.cohort = cohortField.text ?? "" navigationController?.popViewController(animated: true) From 8309f24d3f6940266dee34671d453d97756486d8 Mon Sep 17 00:00:00 2001 From: Ben Hakes Date: Thu, 6 Dec 2018 16:47:31 -0600 Subject: [PATCH 07/10] refactored model to be more streamlined --- .../UserInterfaceState.xcuserstate | Bin 34062 -> 34047 bytes ios-firebase/ios-firebase/Model/Model.swift | 5 +---- .../DetailViewController.swift | 7 ++++++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcuserdata/bhhakes.xcuserdatad/UserInterfaceState.xcuserstate b/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcuserdata/bhhakes.xcuserdatad/UserInterfaceState.xcuserstate index e2913a4238d3aaed5f59298424f8c859931baf05..75a334c3c893c7d821356a7d67023a047eb6a462 100644 GIT binary patch delta 13252 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

r$IfML)oI@@qmyxZPlPk$p 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 diff --git a/ios-firebase/ios-firebase/Model/Model.swift b/ios-firebase/ios-firebase/Model/Model.swift index f729991..dc2a276 100644 --- a/ios-firebase/ios-firebase/Model/Model.swift +++ b/ios-firebase/ios-firebase/Model/Model.swift @@ -31,8 +31,6 @@ class Model { func addNewPerson(person: Person, completion: @escaping () -> Void) { - let person = person - // append it to our devices array, updating our local model <-- local persons.append(person) @@ -60,9 +58,8 @@ class Model { } - func updatePerson(at indexPath: IndexPath, completion: @escaping () -> Void) { + func updatePerson(for person: Person, completion: @escaping () -> Void) { // - let person = persons[indexPath.row] // TODO: do we need this? //device.uuid = UUID().uuidString diff --git a/ios-firebase/ios-firebase/ViewControllerAndCells/DetailViewController.swift b/ios-firebase/ios-firebase/ViewControllerAndCells/DetailViewController.swift index f4cf5c4..8c6a39b 100644 --- a/ios-firebase/ios-firebase/ViewControllerAndCells/DetailViewController.swift +++ b/ios-firebase/ios-firebase/ViewControllerAndCells/DetailViewController.swift @@ -2,6 +2,7 @@ import UIKit class DetailViewController: UIViewController { var person: Person? + var row: Int? @IBOutlet weak var nameField: UITextField! @IBOutlet weak var cohortField: UITextField! @@ -17,7 +18,11 @@ class DetailViewController: UIViewController { @IBAction func save(_ sender: Any) { guard let person = person else { return } guard let name = nameField.text, !name.isEmpty else { return } - Model.shared. + + guard let indexPath = row else { return } + + Model.shared.updatePerson( + }) person.name = name person.cohort = cohortField.text ?? "" From 93036a6f3849bfd4023651d7c1509fe5e249027a Mon Sep 17 00:00:00 2001 From: Ben Hakes Date: Thu, 6 Dec 2018 17:30:13 -0600 Subject: [PATCH 08/10] implement MVP functionality except delete --- .../UserInterfaceState.xcuserstate | Bin 34047 -> 35757 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 +++++ ios-firebase/ios-firebase/Model/Model.swift | 12 ++---------- .../DetailViewController.swift | 9 +++------ .../ViewControllerAndCells/EntryCell.swift | 3 ++- .../TableViewController.swift | 13 ++++--------- 6 files changed, 16 insertions(+), 26 deletions(-) create mode 100644 ios-firebase/ios-firebase.xcodeproj/xcuserdata/bhhakes.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist diff --git a/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcuserdata/bhhakes.xcuserdatad/UserInterfaceState.xcuserstate b/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcuserdata/bhhakes.xcuserdatad/UserInterfaceState.xcuserstate index 75a334c3c893c7d821356a7d67023a047eb6a462..303c79d26c8cfbf0ecaa0d68be10cb0c414bd99c 100644 GIT binary patch delta 16040 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 delta 14156 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

dBk|=JPaNw9%&vK9wv`$ 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 RKLE~O*5Ul^I1k_Z{{TwUe*^#k diff --git a/ios-firebase/ios-firebase.xcodeproj/xcuserdata/bhhakes.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/ios-firebase/ios-firebase.xcodeproj/xcuserdata/bhhakes.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..fe2b454 --- /dev/null +++ b/ios-firebase/ios-firebase.xcodeproj/xcuserdata/bhhakes.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/ios-firebase/ios-firebase/Model/Model.swift b/ios-firebase/ios-firebase/Model/Model.swift index dc2a276..801755b 100644 --- a/ios-firebase/ios-firebase/Model/Model.swift +++ b/ios-firebase/ios-firebase/Model/Model.swift @@ -22,13 +22,6 @@ class Model { // MARK: Core Database Management Methods - - // TODO: remove this when addNewPerson is complete and working - func add(person: Person) { - persons.append(person) - delegate?.modelDidUpdate() - } - func addNewPerson(person: Person, completion: @escaping () -> Void) { // append it to our devices array, updating our local model <-- local @@ -39,7 +32,7 @@ class Model { guard success else {return} DispatchQueue.main.async { completion()} } - + delegate?.modelDidUpdate() } func deletePerson(at indexPath: IndexPath, completion: @escaping () -> Void) { @@ -54,7 +47,7 @@ class Model { guard success else {return} DispatchQueue.main.async { completion()} } - + delegate?.modelDidUpdate() } @@ -69,6 +62,5 @@ class Model { guard success else {return} DispatchQueue.main.async { completion()} } - } } diff --git a/ios-firebase/ios-firebase/ViewControllerAndCells/DetailViewController.swift b/ios-firebase/ios-firebase/ViewControllerAndCells/DetailViewController.swift index 8c6a39b..a344d39 100644 --- a/ios-firebase/ios-firebase/ViewControllerAndCells/DetailViewController.swift +++ b/ios-firebase/ios-firebase/ViewControllerAndCells/DetailViewController.swift @@ -2,7 +2,6 @@ import UIKit class DetailViewController: UIViewController { var person: Person? - var row: Int? @IBOutlet weak var nameField: UITextField! @IBOutlet weak var cohortField: UITextField! @@ -19,13 +18,11 @@ class DetailViewController: UIViewController { guard let person = person else { return } guard let name = nameField.text, !name.isEmpty else { return } - guard let indexPath = row else { return } - - Model.shared.updatePerson( - }) - person.name = name person.cohort = cohortField.text ?? "" + + Model.shared.updatePerson(for: person, completion: {}) + navigationController?.popViewController(animated: true) } } diff --git a/ios-firebase/ios-firebase/ViewControllerAndCells/EntryCell.swift b/ios-firebase/ios-firebase/ViewControllerAndCells/EntryCell.swift index b135852..449d5b0 100644 --- a/ios-firebase/ios-firebase/ViewControllerAndCells/EntryCell.swift +++ b/ios-firebase/ios-firebase/ViewControllerAndCells/EntryCell.swift @@ -11,7 +11,8 @@ class EntryCell: UITableViewCell { guard let name = nameField.text, !name.isEmpty else { return } // name has to be filled out let cohort = cohortField.text ?? "" // cohort is optional let person = Person(name: name, cohort: cohort) // create a new person instance - Model.shared.add(person: person) + Model.shared.addNewPerson(person: person) {} + nameField.text = nil // reset the name field to be blank cohortField.text = nil // reset the cohort field to be blank } diff --git a/ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift b/ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift index 79b8ed4..5fed635 100644 --- a/ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift +++ b/ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift @@ -43,17 +43,12 @@ class TableViewController: UITableViewController, ModelUpdateClient { } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - if indexPath.section == 0 { + if indexPath.section != 1 { // handle the single entry cell // return it guard let cell = tableView.dequeueReusableCell(withIdentifier: EntryCell.reuseIdentifier, for: indexPath) as? EntryCell else { fatalError("Unable to dequeue entry cell") } - let person = Model.shared.person(forIndex: indexPath.row) - - cell.nameField.text = person.name - cell.cohortField.text = person.cohort - return cell } @@ -61,9 +56,9 @@ class TableViewController: UITableViewController, ModelUpdateClient { guard let cell = tableView.dequeueReusableCell(withIdentifier: PersonCell.reuseIdentifier, for: indexPath) as? PersonCell else { fatalError("Unable to dequeue person cell") } - let person = Model.shared.person(forIndex: indexPath.row) - cell.nameLabel.text = person.name - cell.cohortLabel.text = person.cohort + let person = Model.shared.person(forIndex: indexPath.row) + cell.nameLabel.text = person.name + cell.cohortLabel.text = person.cohort return cell } From 3c7491db8ebebeaef2b9f265e4df57ac5f15599f Mon Sep 17 00:00:00 2001 From: Ben Hakes Date: Thu, 6 Dec 2018 17:33:34 -0600 Subject: [PATCH 09/10] add swipe to delete functionality w/ firebase update --- .../UserInterfaceState.xcuserstate | Bin 35757 -> 35937 bytes .../TableViewController.swift | 11 +++++++++++ 2 files changed, 11 insertions(+) diff --git a/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcuserdata/bhhakes.xcuserdatad/UserInterfaceState.xcuserstate b/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcuserdata/bhhakes.xcuserdatad/UserInterfaceState.xcuserstate index 303c79d26c8cfbf0ecaa0d68be10cb0c414bd99c..1770ad2598b6ecc21ee4478e6b58708343e0a6d8 100644 GIT binary patch delta 15673 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 diff --git a/ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift b/ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift index 5fed635..7de55ea 100644 --- a/ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift +++ b/ios-firebase/ios-firebase/ViewControllerAndCells/TableViewController.swift @@ -62,6 +62,17 @@ class TableViewController: UITableViewController, ModelUpdateClient { return cell } + override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { + + guard editingStyle == .delete else { return } + + // FIXME: Delete an item, update Firebase, update model, and reload data + Model.shared.deletePerson(at: indexPath) { + self.tableView.reloadData() + } + + } + override func viewDidLoad() { super.viewDidLoad() Model.shared.delegate = self From 6d028fbdf61fc3b7f3e0b4352f70583187d7c8ed Mon Sep 17 00:00:00 2001 From: Ben Hakes Date: Thu, 6 Dec 2018 19:09:31 -0600 Subject: [PATCH 10/10] finish questions.md --- ios-firebase/Questions.md | 13 +++++++++++++ .../UserInterfaceState.xcuserstate | Bin 35937 -> 35958 bytes ios-firebase/ios-firebase/Model/Model.swift | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/ios-firebase/Questions.md b/ios-firebase/Questions.md index 9ad1dc3..8203bb5 100644 --- a/ios-firebase/Questions.md +++ b/ios-firebase/Questions.md @@ -1,19 +1,32 @@ # Questions: ### What is a RESTful interface? When do you use it? What are its characteristics? +It's a software architectural pattern that is used for designing client to server communications. A RESTful interface is used when a client (computer) needs to request or post information to a webserver. The main methods a client can send to a webserver are GET/PUT/POST/DELETE. These methods correspond with "CRUD" methods for traditional databases. Create-POST, GET-Read, Update-PUT, Delete-DELETE. ### What is the difference between POST and PUT? POST: Create (each time creates a new record). Post ALWAYS creates a new item. PUT: Update (Don’t confuse this with POST), to a specific record id, replacing the data for that record. ### How does the record ID work in Firebase? Why does it take two steps to save a record (first POST then PUT) in our app? Why does the FirebaseItem protocol even exist? +The record ID is randomly generated when a POST request is made. It takes two steps to save a record (first POST then PUT) in our app because when we send the POST initially, we do not know the record ID ahead of time. Firebase will send the record ID back to us after the POST request, which we handle with another PUT request, saving the record ID locally and putting it back to Firebase. ### Explain what a generic type is and what advantages it offers. +A generic type allows you to specify all of the requirement of a type without needing to explicitly state it. It's like a placeholder. It promotes code reusability. ### What does a URLRequest do? When do you need one and when can you just use a URL? + Definition via Apple: A URL load request that is independent of protocol or URL scheme. URLRequest encapsulates two basic data elements of a load request: the URL to load, and the policy to use when consulting the URL content cache made available by the implementation. This type serves only to encapsulate information about a URL request. You must use other classes such as URLSession to send these requests to a server. + + I think you can use URL when you are making simple GET requests. For more complicated RESTful requests, I think it is standard to use URLRequest. ### What is the role of a URL session? How does it work? +Definition via Apple: It provides an API for downloading content. An object that coordinates a group of related network data transfer tasks. With the URLSession API, your app creates one or more sessions, each of which coordinates a group of related data transfer tasks. For example, if you’re creating a web browser, your app might create one session per tab or window, or one session for interactive use and another for background downloads. Within each session, your app adds a series of tasks, each of which represents a request for a specific URL (following HTTP redirects, if necessary). + +URLSession has a singleton shared session (which has no configuration object) for basic requests. It’s not as customizable as sessions you create, but it serves as a good starting point if you have very limited requirements. You access this session by calling the shared class method. For other kinds of sessions, you instantiate a URLSession with one of three kinds of configurations: ### What are completion handlers? Why use completion handlers? What advantages do they provide? + You use completion handlers when you don't know how long a data task is going to take. They allow you to specify what to do when you get a request finishes. The advantage is the data request can take a significantly variable amount of time and yet the completion closure will still work. ### Explain at least three strategies that promote code reuse that we used in today's project +1. We used code reuse in the Firebase network controller class. That class has everything we need to make network calls no matter what the specific. +2. We also used a generic type, that would potentially allow us to use the network class with multiple data types. +3. We used the PUT method as a completion handler to the POST method, allowing us to not have to rewrite the PUT method within the POST method. diff --git a/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcuserdata/bhhakes.xcuserdatad/UserInterfaceState.xcuserstate b/ios-firebase/ios-firebase.xcodeproj/project.xcworkspace/xcuserdata/bhhakes.xcuserdatad/UserInterfaceState.xcuserstate index 1770ad2598b6ecc21ee4478e6b58708343e0a6d8..4f48b57602825384dd5680c64489fadfe89f6bad 100644 GIT binary patch delta 14262 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 b__*G- delta 14262 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 C*+eV= diff --git a/ios-firebase/ios-firebase/Model/Model.swift b/ios-firebase/ios-firebase/Model/Model.swift index 801755b..cddb7bc 100644 --- a/ios-firebase/ios-firebase/Model/Model.swift +++ b/ios-firebase/ios-firebase/Model/Model.swift @@ -47,7 +47,7 @@ class Model { guard success else {return} DispatchQueue.main.async { completion()} } - delegate?.modelDidUpdate() + }