[SeSAC] October 19, 2023

✔︎ 오늘의 정리

  • NotificationCenter를 이용하여 값 전달하기 특정 시점에 셀의 데이터를 VC로 가져오기
  • Linked List
  • RxSwift 용어 복습 ,,

 


NotificationCenter를 이용하여 값 전달하기 특정 시점에 셀의 데이터를 VC로 가져오기

나는...... 완전 까묵고 있었다

notificationCenter를 이용해서 값을 전달할 수 있다는 건 배웠고? 알고 있었는데? 그 방법은 완전 까먹고 있었다 ㅋㅋ

delegate랑 completionHandler를 이용해서 값 전달하는 건 이제 걍 아.. 해야대네? 하면 상황에 맞게 활용하고 있었는데

notificationCenter는 왜케 하기 싫은 건지 사실 하기 싫다기보다는 좀 생소해 보여서?? 다른 게 취향에 맞아서... 그냥 잘 안 쓰게 됐던 것 같다

 

근데 지금 하고 있는 뷰를 보니 도저히 notificationCenter를 쓰지 않으면 힘들 것 같아서 ,, 그냥 쓰려고 한다.

 

 

+) 근데 안 됐음

시도햇던 코드는 다음과 같다...

    override func configureView() {
        configureTextField([dateTextField, timeTextField], date: dateTextField, time: timeTextField)
        
        NotificationCenter.default.addObserver(self, selector: #selector(sendVaccineType), name: NSNotification.Name(rawValue: "vaccineType0"), object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(sendVaccineType), name: NSNotification.Name(rawValue: "vaccineType1"), object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(sendVaccineType), name: NSNotification.Name(rawValue: "vaccineType2"), object: nil)
        
        print("notification setting")
    }
    
    @objc func sendVaccineType(_ notification : NSNotification) {
        print(notification.name)
        let data = notification.object as? String ?? ""
        print(data)
        let vaccineType = notification.userInfo!["vaccineType"]! as! String
        let itemNumber = notification.userInfo!["itemNumber"]! as! Int
        if itemNumber == 0 {
            self.vaccineType.0 = vaccineType
        } else if itemNumber == 1 {
            self.vaccineType.1 = vaccineType
        } else if itemNumber == 2 {
            self.vaccineType.2 = vaccineType
        }
        print(self.vaccineType)
    }
... ...
    func configureNotificationCenter() {
        print("itemNumber: ")
        print(itemNumber)
        guard let itemNumber else { return }
        
        var text = ""
        if let typeText = vaccineTypeTextField.text {
            text = typeText
        } else if let inputText = inputVaccineTextField.text {
            text = inputText
        }
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "vaccineType\(itemNumber)") , object: nil, userInfo: ["vaccineType": text, "itemNumber": itemNumber])
    }
    
    func getVaccineType() -> String? {
        if noVaccineButton.isSelected == true { // inputTextField
            return inputVaccineTextField.text
        } else { // vaccineTextField
            return vaccineTypeTextField.text
        }
    }

각 셀마다 itemIdentifier를 줘서 어케든 데이터를 가져와보려고 한 흔적 ,, 이다

근데 좀 웃기네

 

 

 

 

그러니까 해결하고 싶었던 상황은 다음과 같다

 

백신VC에서 각 셀의 버튼을 누르면 백신 타입을 정하는 VC가 뜨고, 이 뷰컨트롤러에서는 셀의 textField로 데이터를 전달한다.

여기까지는 아주 ㄱㅊ음

 

근데 문제는 저장 버튼을 누를 때다.

저장 버튼을 누를 때 이 셀의 데이터를 가져와서 ㅜ먼가를 써야 하는데

원래 같았으면 이 셀의 데이터를 빠딱빠딱 전달받는? 식으로 만들었을 것 같다

다만 문제가 있다면 자주 만들었던 테이블뷰 / 콜렉션뷰와는 다르게 이 콜렉션뷰의 경우에는 유동적으로 추가됐다가 삭제될 수 있다는 것이다.

 

그러니까 원래 했던 데이터 전달 방식으로 한다면? 좀 문제가 생긴다.

ㅜㅜ 전달받는 데이터가 하나였음 그걸로 할 수 있었을 텐데 나는 최대 3개까지 입력할 수 있게 해서 더 망했다

 

해결 방법은 .. 다음과 같다.

일단 Cell에 함수를 하나 맹글어 준다.

    func loadVaccineType() -> String? {
        if noVaccineButton.isSelected == true { // inputTextField
            return inputVaccineTextField.text
        } else { // vaccineTextField
            return vaccineTypeTextField.text
        }
    }

뭔가 변수로는 만들 수가 없던 게 ,, 나중에 보면 셀을 타입 캐스팅을 하게 되는데

그때 프로퍼티는 가져오지 못하고 함수만 가져올 수 있더라.

왠지는 모르겠음

나중에 찾아봐야겠다 , ,,

 

여하튼 그래서 이렇게 Cell에서 데이터를 받아올 함수를 맹글어 줬다면

    func getVaccineTypeFromCell() {
        for i in 0..<vaccineCollectionView.numberOfItems(inSection: 0) {
            if let cell = vaccineCollectionView.cellForItem(at: IndexPath(item: i, section: 0)) as? VaccineCategoryCollectionViewCell {
                if let text = cell.loadVaccineType() {
                    if !text.isEmpty {
                        vaccineTypes.append(text)
                    } else {
                        sendOneSidedAlert(title: "백신 항목을 입력해 주세요!")
                    }
                } else {
                    sendOneSidedAlert(title: "백신 항목을 입력해 주세요!")
                }
            }
        }
    }

진짜 말그대로 내가 원하는 시점에 collectionView의 셀을 돌아가면서 해당 method를 계속 호출하며 값을 넣어주면 된다.

하.....................................................................................................

원래 이런 방법을 생각은? 했었는데

함수만 있는 거 보고 엥? 하고 이 방법이 아닌가부다 하고 넘겼었다

근데 걍 .. 내가 할 수 잇는 모든 방법(delegate / completionHandler / notificationCenter)으로 다 해봐도 원하는대로 안 나오길래 무식하게 때렸더니 오히려 정답이었다

왜 2시간짜리가 30시간 걸리는지 알겠음

이게 그런 거 같다............................................

 

코딩은 참 알수가업군아

 

그래도해결했으니다행이다

 

 

 

 

 

 

Linked List

사실 개발을 처음에 시작하고 한 달? 좀 덜 됐을 때 이 개념을 처음 접했는데 진짜!!!!! 도저히!!!!! 이해가 안 갔었다

진심 아무리 들어도 이걸 왜 쓰고 대체 이게 뭔데????? 싶었는데 지금 설명을 들으니 넘 쏙쏙 이해됐다

아마 K님이 설명을 왕잘해주셔서도 있지만 나도 많이 성장하지 않았을가 ,, 싶다 ,, ^____^

 

사실 링크드리스트는 배열과 많이 비교되는 만큼 배열도 같이 정리하면 좋겠지만!!

너무졸리고 그래두 링크드리스트는 정리하고 자고 싶어서 바로 정리하고 자보려고 한다 ㅋㅋ

 

 

먼저! Linked List는 데이터와 포인터를 가지고 있는 '노드'라는 친구들이 줄처럼 연결되어 있는 구조를 말한다.

 

이렇게!

앞 부분은 head, 뒷 부분은 tail이라고 하며, 링크드 리스트의 특징으로는 처음과 끝이 아닌 중간 값의 인덱스에 있는 데이터를 찾는다면 처음부터 차례차례 타고들어가야 하는 것이다.

만약에 주소를 모른 채로 삽입 / 삭제를 해야 한다면? 아까와 같이 어디 있는지 모를 데이터를 찾아야 하므로 차례차례 타고 들어가야 한다. 그럼 짧으면 한 번만에 찾을 것이고, 오래 걸린다면 결국 링크드 리스트 끝까지 가서야 데이터를 찾을 수 있다.

 

헐~~ 이걸 보면 링크드 리스트는 왜 쓰지??? 하는 생각이 ,, 든다 ,,

솔직히 여기까지는 배열도 똑같지 않나?

근데 배열은 index를 통해 접근 가능하므로 중간값이 있다면 헐~ 얘 여기! 하고 바로 그 부분을 찾아들어갈 수 있을 것이다 ㅇㅂㅇ

배열은 탐색 시 시간 복잡도가 O(1)이니까!!!! (인덱스 있음 바로 찾음)

 

그에 비해 링크드 리스트의 시간 복잡도는 탐색과 주소를 모를 때 삽입 / 삭제 시 모두 O(N)이 된다.

 

긍데 이게 주소값을 알고 있고 해당 값에 추가 / 삭제를 많이 하게 되는 값들에 사용된다고 한다면?????

링크드 리스트는 빛을 발한다.

배열은 주솟값을 알아도 그 주솟값에 밀어넣고 나머지 배열들을 민 뒤에 그 빈 자리에 해당 값을 넣어야 하므로 시간 복잡도가 O(N)이 나온다. 그에 반해 링크드 리스트는 O(1)이다.

왜냠 한 객체가 누굴 가리키고 있는지 알고 있었고, 나는 그 사이에 쏙 껴서 그대로 가리키기만 하면 되니까!

 

삽입 시에는 이전의 노드가 가리키고 있던 노드를 삽입한 노드가 그대로 가리키면 되는 것이고,

삭제 시에는 삭제된 노드가 가리키고 있던 노드를 그대로 이전 노드가 가리키면 되기 땜에. O(1)이 되는 것이다.

 

암튼.

 

이런 특징을 가진 링크드 리스트는 단방향과 양방향으로 나뉘는데... ...

  • 단방향 링크드리스트
    • 무조건 처음부터 찾아가야 함
    • 내가 누구한테 전달해야 하는지만 알 수 있음
  • 양방향 링크드리스트
    • 내가 누구 다음인지, 누구한테 전달해야 하는지만 알고 있으면 좋음!!
    • head와 tail을 둘 다 알고 있음
    • 장: 단방향과는 다르게 한 개의 노드만 있다면 모든 링크드리스트 탐색 가능!!
    • 단: 이전 노드에 대한 정보도 알아야 해서 저장되는 크기가 더 커지고, 삽입/삭제 시에 조금 더 복잡해짐

 

 

 

^___^ b

 

 

 

 

RxSwift 용어 복습

 

 

 

notificationCenter랑 비슷한 거 같다

근데 왜케 안되는건지 정말 ㄱ-

 

현재 같은 오류로 계속 골머리를 앓고 있다.

걍 쓰는 방법마다 안 되니까 쓰고 ,, 지우고 ,, 반복 중 ,,

ㅜㅜ

 

뭔가? 딱 저장하는 시점에 해당 셀에서 데이터를 가지고 오고 싶은데

어케 하면 그럴 수 있을지 잘 감이 안 잡힌다

아...

 

해결해서 위에 수정했다!!!!!!!!!!!!!!!!!!!!!!!!!!!!

내가이겼다 ㅁㅊ자식..

 

 

헐 이거 안 올리고 잤네

늦게라도 올린다,, ^_^

'TIL' 카테고리의 다른 글

[SeSAC] November 1, 2023  (2) 2023.11.01
[SeSAC] October 24, 2023  (5) 2023.10.24
[SeSAC] October 15, 2023  (2) 2023.10.16
[SeSAC] October 12, 2023  (1) 2023.10.13
[SeSAC] October 7, 2023  (0) 2023.10.07