Skip to content

Commit

Permalink
Merge pull request #73 from aCafela-coffee/step1
Browse files Browse the repository at this point in the history
프로젝트 관리 앱 [STEP 1] aCafela coffee
  • Loading branch information
hyunable authored Mar 4, 2022
2 parents 04dd65a + 049a9ab commit 2a8d6ef
Show file tree
Hide file tree
Showing 8 changed files with 184 additions and 78 deletions.
63 changes: 58 additions & 5 deletions ProjectManager/ProjectManager.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objectVersion = 52;
objects = {

/* Begin PBXBuildFile section */
3A88687627D0BA1B00E24263 /* RxCocoa-Dynamic in Frameworks */ = {isa = PBXBuildFile; productRef = 3A88687527D0BA1B00E24263 /* RxCocoa-Dynamic */; };
3A88687E27D0BE7C00E24263 /* RxCocoa-Dynamic in Embed Frameworks */ = {isa = PBXBuildFile; productRef = 3A88687527D0BA1B00E24263 /* RxCocoa-Dynamic */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
C7431F0625F51E1D0094C4CF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7431F0525F51E1D0094C4CF /* AppDelegate.swift */; };
C7431F0825F51E1D0094C4CF /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7431F0725F51E1D0094C4CF /* SceneDelegate.swift */; };
C7431F0A25F51E1D0094C4CF /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7431F0925F51E1D0094C4CF /* ViewController.swift */; };
Expand All @@ -15,6 +17,20 @@
C7431F1225F51E1E0094C4CF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C7431F1025F51E1E0094C4CF /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */

/* Begin PBXCopyFilesBuildPhase section */
3A88687B27D0BA1B00E24263 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
3A88687E27D0BE7C00E24263 /* RxCocoa-Dynamic in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */

/* Begin PBXFileReference section */
C7431F0225F51E1D0094C4CF /* ProjectManager.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ProjectManager.app; sourceTree = BUILT_PRODUCTS_DIR; };
C7431F0525F51E1D0094C4CF /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
Expand All @@ -31,19 +47,30 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
3A88687627D0BA1B00E24263 /* RxCocoa-Dynamic in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
3A88687027D0B9EA00E24263 /* Frameworks */ = {
isa = PBXGroup;
children = (
);
name = Frameworks;
sourceTree = "<group>";
};
C7431EF925F51E1D0094C4CF = {
isa = PBXGroup;
children = (
C7431F0425F51E1D0094C4CF /* ProjectManager */,
C7431F0325F51E1D0094C4CF /* Products */,
3A88687027D0B9EA00E24263 /* Frameworks */,
);
indentWidth = 2;
sourceTree = "<group>";
tabWidth = 2;
};
C7431F0325F51E1D0094C4CF /* Products */ = {
isa = PBXGroup;
Expand Down Expand Up @@ -77,12 +104,16 @@
C7431EFE25F51E1D0094C4CF /* Sources */,
C7431EFF25F51E1D0094C4CF /* Frameworks */,
C7431F0025F51E1D0094C4CF /* Resources */,
3A88687B27D0BA1B00E24263 /* Embed Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = ProjectManager;
packageProductDependencies = (
3A88687527D0BA1B00E24263 /* RxCocoa-Dynamic */,
);
productName = ProjectManager;
productReference = C7431F0225F51E1D0094C4CF /* ProjectManager.app */;
productType = "com.apple.product-type.application";
Expand Down Expand Up @@ -110,6 +141,9 @@
Base,
);
mainGroup = C7431EF925F51E1D0094C4CF;
packageReferences = (
3AF9204127D0B70F00A328E2 /* XCRemoteSwiftPackageReference "RxSwift" */,
);
productRefGroup = C7431F0325F51E1D0094C4CF /* Products */;
projectDirPath = "";
projectRoot = "";
Expand Down Expand Up @@ -216,7 +250,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
Expand Down Expand Up @@ -271,7 +305,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
Expand All @@ -288,7 +322,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = ProjectManager/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.1;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand All @@ -307,7 +341,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = ProjectManager/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.1;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down Expand Up @@ -341,6 +375,25 @@
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */

/* Begin XCRemoteSwiftPackageReference section */
3AF9204127D0B70F00A328E2 /* XCRemoteSwiftPackageReference "RxSwift" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/ReactiveX/RxSwift";
requirement = {
kind = upToNextMinorVersion;
minimumVersion = 6.5.0;
};
};
/* End XCRemoteSwiftPackageReference section */

/* Begin XCSwiftPackageProductDependency section */
3A88687527D0BA1B00E24263 /* RxCocoa-Dynamic */ = {
isa = XCSwiftPackageProductDependency;
package = 3AF9204127D0B70F00A328E2 /* XCRemoteSwiftPackageReference "RxSwift" */;
productName = "RxCocoa-Dynamic";
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = C7431EFA25F51E1D0094C4CF /* Project object */;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"object": {
"pins": [
{
"package": "RxSwift",
"repositoryURL": "https://github.com/ReactiveX/RxSwift",
"state": {
"branch": null,
"revision": "b4307ba0b6425c0ba4178e138799946c3da594f8",
"version": "6.5.0"
}
}
]
},
"version": 1
}
46 changes: 23 additions & 23 deletions ProjectManager/ProjectManager/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,28 +8,28 @@ import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {



func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
}

// MARK: UISceneSession Lifecycle

func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}

func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
}
// MARK: UISceneSession Lifecycle
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
}

80 changes: 40 additions & 40 deletions ProjectManager/ProjectManager/SceneDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,45 +7,45 @@
import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

var window: UIWindow?


func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
guard let _ = (scene as? UIWindowScene) else { return }
}

func sceneDidDisconnect(_ scene: UIScene) {
// Called as the scene is being released by the system.
// This occurs shortly after the scene enters the background, or when its session is discarded.
// Release any resources associated with this scene that can be re-created the next time the scene connects.
// The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
}

func sceneDidBecomeActive(_ scene: UIScene) {
// Called when the scene has moved from an inactive state to an active state.
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
}

func sceneWillResignActive(_ scene: UIScene) {
// Called when the scene will move from an active state to an inactive state.
// This may occur due to temporary interruptions (ex. an incoming phone call).
}

func sceneWillEnterForeground(_ scene: UIScene) {
// Called as the scene transitions from the background to the foreground.
// Use this method to undo the changes made on entering the background.
}

func sceneDidEnterBackground(_ scene: UIScene) {
// Called as the scene transitions from the foreground to the background.
// Use this method to save data, release shared resources, and store enough scene-specific state information
// to restore the scene back to its current state.
}


var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
guard let _ = (scene as? UIWindowScene) else { return }
}
func sceneDidDisconnect(_ scene: UIScene) {
// Called as the scene is being released by the system.
// This occurs shortly after the scene enters the background, or when its session is discarded.
// Release any resources associated with this scene that can be re-created the next time the scene connects.
// The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
}
func sceneDidBecomeActive(_ scene: UIScene) {
// Called when the scene has moved from an inactive state to an active state.
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
}
func sceneWillResignActive(_ scene: UIScene) {
// Called when the scene will move from an active state to an inactive state.
// This may occur due to temporary interruptions (ex. an incoming phone call).
}
func sceneWillEnterForeground(_ scene: UIScene) {
// Called as the scene transitions from the background to the foreground.
// Use this method to undo the changes made on entering the background.
}
func sceneDidEnterBackground(_ scene: UIScene) {
// Called as the scene transitions from the foreground to the background.
// Use this method to save data, release shared resources, and store enough scene-specific state information
// to restore the scene back to its current state.
}
}

14 changes: 7 additions & 7 deletions ProjectManager/ProjectManager/ViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@
import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}


override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}

Binary file added README.assets/xcode13.2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
35 changes: 32 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,36 @@
## iOS 커리어 스타터 캠프
# STEP 1

### 프로젝트 관리 앱 저장소
## 적용기술 선정

- 이 저장소를 자신의 저장소로 fork하여 프로젝트를 진행합니다
- [RxSwift](https://github.com/ReactiveX/RxSwift)
- [CoreData](https://developer.apple.com/documentation/coredata/)

## 고민 포인트

- 하위 버전 호환성에는 문제가 없는가?
- RxSwift 6.5.0: iOS 9.0, Xcode 12.x, Swift 5.x
- CoreData: iOS 3.0

- 미래 지속가능성이 있는가?
- CoreData는 애플에서 만들었으니 오래 지원될 듯 합니다.
- RxSwift는 Combine, Swift Concurrency로 대체될 가능성이 있습니다.
- Swift Concurrency는 macOS 12/iOS 15에서 사용 가능합니다.
- Xcode 13.2에서는 iOS13에서도 사용 가능합니다.
- ![xcode13.2](README.assets/xcode13.2.png)

- 안정적으로 운용 가능한가?

- 리스크를 최소화 할 수 있는가? 알고있는 리스크는 무엇인가?
- RxSwift: GitHub 별도 많고, 쓰는 사람도 많아 보입니다. 1~2년 정도는 문제없이 사용가능할 것 입니다. 그러나 나중에도 이게 최선일지는 알 수 없습니다.
- RxSwift: SPM에서 버그가 있습니다.

> [RxSwift](https://github.com/ReactiveX/RxSwift#swift-package-manager)
> **Note**: There is a critical cross-dependency bug affecting many projects including RxSwift in Swift Package Manager. We've [filed a bug (SR-12303)](https://bugs.swift.org/browse/SR-12303) in early 2020 but have no answer yet. Your mileage may vary. A partial workaround can be found [here](https://github.com/ReactiveX/RxSwift/issues/2127#issuecomment-717830502).
>
- 어떤 의존성 관리도구를 사용하여 관리할 수 있는가?
- CocoaPod, SPM, Carthage

- 이 앱의 요구기능에 적절한 선택인가?
- CoreData: 로컬 데이터 저장에 적절할 것 입니다. 리모트와 동기화는 고민이 필요합니다.
- RxSwift: 사용법을 잘 모르지만, 공부를 위해 사용하는 것입니다.

0 comments on commit 2a8d6ef

Please sign in to comment.