전체 글
-
[Swift] ThreadSafe 한 Class 만들기Swift 2023. 10. 24. 13:26
Actor | Apple Developer Documentation Common protocol to which all actors conform. developer.apple.com Sendable | Apple Developer Documentation A type whose values can safely be passed across concurrency domains by copying. developer.apple.com 동시에 여러 쓰레드에서 하나의 인스턴스에 접근하면 어떻게 될까? 아무 조치도 취하지 않는다면 값은 이미 변했지만 변하지 않은 값을 돌려받을 수도 있다. 그래서 thread safe 하게 race condition 을 피해주어야한다. 그럴때 사용되는 것이 Actor 와 Send..
-
[Swift] DispatchQueue.global() 과 Task.detatched(priority: .background) 의 차이점Swift 2023. 10. 24. 12:01
Task | Apple Developer Documentation A unit of asynchronous work. developer.apple.com DispatchQueue.global().async { // background work } // struct 이기 때문에 변수에 할당 가능 let task = Task.detatched(priority: .background) { try await doSomethingBadAss() } Task { // task.result 로 결과를 예외 처리 가능 switch await task.result { case .success(let result): break case .failure(let error): break } // failure 처리 안할꺼면 ..
-
[Swift] Mirror 써보기Swift 2023. 10. 18. 15:51
class User: NSObject { // setValue 는 NSObject 의 method @objc var login: String = "raw" // string -> key 로 접근 가능 } func hasProperty(_ name: String, object: AnyObject) -> Bool { let mirror = Mirror(reflecting: object) for (label, _) in mirror.children { if label == name { return true } } return false } var user = User() // login: "raw" let parameters: [String: Any] = ["login": "octodog"] for (key,..
-
2달 간 클린 아키택쳐를 적용해보고 느낀점카테고리 없음 2023. 10. 5. 02:20
객체지향을 적절하게 잘 적용하면 프로젝트 유지보수가 굉장히 편리해진다. 한 시니어께서 내가 말씀하셨다. “객체지향만 잘 지켜도 클린 아키택쳐까지 적용할 필요가 없다” 라고. 약 2달에 걸쳐 프로젝트에 클린 아키택쳐를 적용하고 나서 보니 이전보다 파일이 많이 생겼고 방대해 졌다. 코드의 재사용성이 좋아져 로직이 마치 레고 맞추듯 들어맞는건 참 좋다. UI 를 컴포넌트화 하듯 로직도 컴포넌트하는 것 같다. 하지만 적용하는데 공수가 많이들고 프로젝트가 비대해진다. 몇 가지 원칙만 잘세우고 객체지향을 잘 준수한다면 굳이 클린 아키택쳐 없이 충분히 좋은 프로젝트를 설계할 수 있을 것 같다. 하지만 만약 앱에서 지원하는 서비스가 다양해서 프로젝트가 크고 팀원이 많다면 클린 아키택쳐는 어쩌면 선택보다는 필수라는 생각..
-
[Swift, Combine] AnyPublisher 를 async/await throws 로 사용해보자Swift 2023. 10. 4. 09:47
https://developer.apple.com/documentation/swift/withcheckedthrowingcontinuation(function:_:) withCheckedThrowingContinuation(function:_:) | Apple Developer DocumentationInvokes the passed in closure with a checked continuation for the current task.developer.apple.com import Foundation import Combine extension AnyPublisher where Failure: Error { var asyncThrows: Output { get async throws { try aw..
-
[UIKit, Combine] UIButton Event 구독하기카테고리 없음 2023. 9. 20. 01:04
import Combine import UIKit class ViewController: UIViewController { let viewModel: ViewModel var cancellable = Set() let uiButton = UIButton() override func viewDidLoad() { super.viewDidLoad() bind() } func bind() { uiButton.tapPublisher .receive(on: RunLoop.main) .sink { [weak self] in self?.viewModel.didTapButton() }.store(in: &cancellable) } } extension UIButton { var tapPublisher: AnyPublis..
-
[UIKit, Combine] UITextField, UITextView text 입력 받기Swift/UIKit 2023. 9. 20. 00:22
class SomeViewController: UIViewController { private let someTextView = UITextView() private let someTextField = UITextField() private let viewModel = ViewModel() override func viewDidLoad() { super.viewDidLoad() bind() } private func bind() { someTextView.textPublisher .receive(on: RunLoop.main) .assign(to: &viewModel.$textViewInput) someTextField.textPublisher .receive(on: RunLoop.main) .assig..