[WIL] iOS숙련 개념 배운 내용 정리

남보경·2023년 9월 3일
1

WIL - Weekly I Learned

목록 보기
3/3
post-thumbnail

[8/18 ~ 8/24] 기간 동안의 학습 내용

📌 Cocoa Touch Framework

1) URL Session

  • Apple Foundation framework에서 제공하는 API.
  • HTTP 요청을 보내고 받는 기능을 제공하는 class
  • 비동기적인 방식으로 동작하며 데이터를 주고 받기 때문에, 백그라운드에서 작업이 이루어질 수 있음 -> 추후 push 알람 등에도 사용가능
  • HTTP, HTTPS, FTP, 등 네트워크 대부분의 통신 관련 요청을 보내고 받을 수 있음
  • 파일 업로드, 다운도르 기능을 제공
  • 백그라운드에서 작업이 가능하며, 앱이 백그라운드에 있을 때도 작업을 수행할 수 있음
  • Authentication, Cookie, Cache 등의 기능을 제공

여기서 비동기 방식이란?

우리가 서버에서 데이터를 받아올 때는 Json 데이터 형식으로 받아옴
Json 데이터 형식을 받아올 때 해당 데이터에 대한 경로를 서버에서 찾아야하고(path), completion handler를 이용해서 함수가 어떤시점에 특정 동작을 할지 지정

class URLManager {
    static let shared = URLManager()
    let url = URL(string: "https://jsonplaceholder.typicode.com/todos")!

    private init() { }
    
    func getJsonData(path: String, completion: @escaping (Result<Data, Error>) -> Void) {
        // Result type을 가진 completion handler를 정의
        let task = URLSession.shared.dataTask(with: url.appending(path: path)) 
{ data, response, error in
            if let error {
                print("Error: \(error.localizedDescription)")
                completion(.failure(NetworkError.unknown(error.localizedDescription)))
                return
            }
            guard let httpResponse = response as? HTTPURLResponse,
                  (200...299).contains(httpResponse.statusCode) else {
                print("Error: invalid response")
                completion(.failure(NetworkError.invalidResponse))
                return
            }
            
            guard let data = data else {
                print("Error: no data")
                completion(.failure(NetworkError.emptyResponse))
                return
            }
            completion(.success(data))
        }
        task.resume()
    }
}
enum NetworkError: Error {
    case emptyResponse
    case invalidResponse
    case unknown(String)
    
}

2) Segue를 통한 viewController간 데이터 통신

👀 Segue란?

: Storyboard에서 ViewController 사이의 화살표로 표현하며 화면 전환을 위해 사용하는 인터페이스 요소임

  • 다음 ViewController로 데이터를 전달 할 수 있음
  • 화면 전화 수행 전 원하는 작업을 설정, 수행할 수 있음
  • 화면 전환시 애니메이션을 적용할 수 있으며 destivation, source로 구성됨
  • storyboard에서 identifier를 정해주지 않았을 경우 의도치 않은 동작을 할 가능성이 있음
  • 화면 전환 후 데이터 전달을 하거나 completion handler에서 데이터 전달 처리

구현 방식은 2가지가 있다.
1. Storyboard에서 구성한 segue

  • prepare(for:sender:)에서 처리
  • showDetail이라는 identifier를 사용하여 segue 설정
// 첫 번째 화면
class FirstViewController: UIViewController {
    @IBAction func buttonTapped(_ sender: UIButton) {
        performSegue(withIdentifier: "showDetail", sender: nil)
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showDetail" {
            if let secondViewController = segue.destination as? SecondViewController {
                secondViewController.data = "Hello, Second View Controller!"
            }
        }
    }
}
// 두 번째 화면
class SecondViewController: UIViewController {
    var data: String?
    @IBOutlet weak var label: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        label.text = data
    }
}
  1. code로 구성한 segue
  • present를 사용해서 completion handler를 사용해 데이터를 전달
// 첫 번째 화면
class FirstViewController: UIViewController {
    @IBAction func buttonTapped(_ sender: UIButton) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil) // 여기서 "Main"은 스토리보드의 이름입니다.
        if let secondViewController = storyboard.instantiateViewController(withIdentifier: "SecondViewController") as? ViewController2 {
            secondViewController.data = "Hello, Second View Controller!"
            present(secondViewController, animated: true, completion: {
                secondViewController.label.text = secondViewController.data
            })
        }
    }
}

// 두 번째 화면
class SecondViewController: UIViewController {
    var data: String?
    @IBOutlet weak var label: UILabel!
}

3) Animation

💁🏻‍♀️ push - slide animation

// 화면 전환하는 버튼을 누를 때
@IBAction func nextButtonTapped(_ sender: UIButton) {
    performSegue(withIdentifier: "showNext", sender: nil)
}

// 다음 화면으로 전환할 때
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
	// 특정 identifier일 경우 data를 가져옴
    if segue.identifier == "showNext" {
    
    	// 수직 방향으로 슬라이드하는 애니메이션 적용
        segue.destination.modalTransitionStyle = .coverVertical
        
    }
}

💁🏻‍♀️ modal - fade animation

modalTransitionStyle의 종류
1. coveVertical: 아래에서 세로로 다음 ViewController가 올라오는 방식으로 default 방식
2. filpHorizontal: 수직으로 가운데를 축으로 삼아 가로방향으로 카드가 뒤집히는 듯한 효과를 냄
3. crossDissolve: 화면이 교차되는 효과
4. partialCurl: 종이를 넘기는 듯한 효과

// 다음 화면으로 전환하는 버튼을 누를 때
@IBAction func nextButtonTapped(_ sender: UIButton) {
    performSegue(withIdentifier: "showNext", sender: nil)
}

// 다음 화면으로 전환할 때
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showNext" {
    	// 페이드 애니메이션 
        segue.destination.modalTransitionStyle = .crossDissolve 적용
    }
}

💁🏻‍♀️ presentationStyle의 종류
: 지금의 화면이 얼마 정도의 크기인지에 영향을 받음

  • 세로 상태 - 가로(Compact), 세로(Regular)
  • 가로 상태 - 가로(Regular), 세로(Compact)
  1. fullScreen: presentationStyle의 기본값, 다른 presentationStyle을 적용할 수 없는 경우 fullScreen으로 동작
  2. pageSheet: 가로가 compact일 경우 fullScreen과 동작이 동일, sheet를 띄우듯이 위와 양옆에 여백을 두고 아래에 반투명 View를 배치
  3. formSheet: 가로가 Regular일 때 content 영역의 크기를 유지해주고 아래에 반투명 View를 배치. 가로모드이고 키보드가 나온다면 View가 위로 올라가는 처리를 자동으로 해줌 (가로 compactfullScreen)
  4. currentContext: definesPresentationContexttrue로 설정되어 있는 Viewcontroller의 영역에 맞춰 새로운 view가 띄워짐. true인 ViewController가 없는 경우 FullScreen으로 동작
  • 일반 View : false가 기본값
  • navigationController등 : true가 기본값
    화면에 2개 이상의 ViewController가 영역을 차지할 때(SplitViewController 등) 하나만 바꿀경우 유용하게 사용됨
  1. overFullScreen: fullScreen과 비슷하지만 띄워지는 View가 투명할 경우 아래 쌓인 View가 비쳐보임(fullScreen에서는 아래의 view가 계층에서 지워지기 때문에 이를 방지하고 싶은 경우 사용)
    6.overCurrentContext: currentContext와 동일하고 overFullScreen처럼 아래 쌓인 View가 지워지지 않기 때문에 비쳐 보임
    7.popover: 특정 위치에서 팝업창처럼 뜨는 형태. 두 가지의 필수 옵션(가로가 regular인 경우만 적용)
  • 어느 정도의 크기? - preferredContentSize를 ViewController에 설정
  • 어떤 view를 띄울 것인가? - popoverPresentationController 프로퍼티로 설정. 두 가지 방법 중에 반드시 하나만 적용 되어야 함
    👆 barButtonItem 프로퍼티를 설정
    ✌️ sourceView와 sourveRect 프로퍼티를 설정
profile
꿈꾸자 그리고 그것을 이뤄내자

1개의 댓글

comment-user-thumbnail
2023년 9월 23일

좋은 내용 감사합니다!
한가지 궁금한 게, segue 부분에서는 vc를 화면에 띄우는 방식을 present로 사용하시는 것 같은데
push - slide animation에서는 performSegue만 하면 되는건가요?

답글 달기