iOS Completion Handler 사용해보기 (return과의 차이점 알아보기)
24 Aug 2021 | iOS개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
셀의 강조 표시된 상태를 설정하고 선택적으로 상태 간 전환 애니메이션을 실행
func setHighlighted(_ highlighted: Bool, animated: Bool)
쉽게말하면 셀을 터치했을때 화면의 섹이 살짝 바뀌는것을 볼수있다.
사용자가 셀을 선택했는지 안했는지를 확인해볼 수 있음. > 사용자 관점에서 좀더 편리하다는 장점이 있다.
개발자적 관점에서는 무엇을 터치했을때 에러가 발생했는지 조금더 직관적으로 볼 수 있다는 장점이 있을 듯 하다….
특정 섹션의 헤더뷰 높이 지정
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int)
특정 섹션의 푸터뷰 높이 지정
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int)
위 두개를 보통 사용하는건 이러한 예시가 있다.
테이블뷰의 타입을 그룹으로 했을때 기본적으로 섹션의 자동 높이가 설정되어 뷰에 나타나게 된다.
그러나 나는 그 섹션의 높이가 마음에 안들거나 조절을 해야하는 경우가 있을텐데, 그때 이 delegate를 사용해준다.
특정 섹션의 헤더뷰 요청
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int)
특정 섹션의 푸터뷰 요청
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int)
지정된 항목이 표시될 때까지 collectionView 스크롤
func scrollToItem(at indexPath: IndexPath, at scrollPosition: UICollectionView.ScrollPosition, animated: Bool)
예제 블로그를 통해 확인해보면
스크롤뷰가 스크롤 되는 동안 계속 호출되는 delegate라고 한다.
스크롤 뷰의 드래그가 끝나기 직전에 델리게이트에 알림
optional func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)
간단한 예시로 생각해보자.
테이블 뷰 안에 컬렉션 뷰가 있다고 생각해보자.
테이블 뷰 중간에 컬렉션 뷰가 있었고, 컬렉션 뷰의 셀을 스크롤 해놓은 상태에서 > index가 0이 아닌상태에서
테이블뷰를 아래로 스크롤했다고 생각해보자.
이때 다시 해당 컬렉션뷰로 돌아갔을때, 컬렉션 뷰의 컨텐트 인덱스는 과연 어디에 위치해 있을까?
이를 정해주는 delegate이다.
말 그대로 사용자가 스크롤을 하고 스크린과 손이 떨어졌을때 호출되는 메소드이다.
이를 통해 스크롤할 때 컨텐트의 위치를 조정하여 페이징되는 효과를 낼 수 있다.
예제 블로그 < 요 블로그 예제를 보면 이해가 쉬울 것 같다.
가로 스크롤 바 표시 여부를 제어하는 부울 값
var showsHorizontalScrollIndicator: Bool { get set }
페이징을 사용할 수 있는 여부를 결정하는 부울 값
var isPagingEnabled: Bool { get set }
개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
dispatchQueue 라는 객체는 메인 스레드나 백그라운드 스레드에서 업무를 직렬이나 병렬적으로 수행하도록 한다.
큐에 업무를 보낼때, 백그라운드 큐에 넣으면 시스템이 알아서 수행해준다. 그런데 각 테스크가 어떤 스레드에 의해 수행되는지는 알수가 없다. 직접 구현해야하는 부분은 동기/비동기적으로 테스크가 수행할 수 있도록 하는 것. 이때 중요한 점은 메인스레드에서는 데드락 이슈로 인해 동기적인 처리를 하지는 않아야 한다.
이때 중요한 것은 스레드를 생성할 수 있는 갯수의 한계는 존재하기 때문에, dispatchQueue는 너무 많이 만들면 안된다.
서로 다른 테스크들을 그룹화하여 테스크들이 완료될때까지 기다리거나 완료되면 알림을 받을 수 있도록 하는 것
여러작업을 하나로 묶는 것. 따라서 그룹에 포함된 모든 작업이 완료되어야 그룹이 완료된다.
let myQueue = dispatchQueue(label: "com.nil.work", attribute: .concurrent)
let myGroup = DispatchGroup()
myGroup.enter()
myQueue.async {
for i in 1...10 {
print("\(i), 가")
}
myGroup.leave()
}
myGroup.enter()
myQueue.async {
for i in 100...105 {
print("\(i), aaaa")
}
myGroup.leave()
}
myGroup.notify(queue: myQueue) {
print("end...")
}
enter와 leave는 서로 쌍을 이루어야 한다!!
개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
버릴수 있는 결과 라는 뜻으로 말 그대로 스위프트에서는 개발자를 위해 여러가지 warning들을 띄워준다.
등등…
이와 마찬가지로 Result of vall to ~~ is unused 와 같이 결과 값이 사용되지 않았습니다. 라는 워닝도 있다.
그러나 결과를 return 하는데 이 결과가 필요 없는 경우도 있을것! 그럴때 warning을 보고싶지않다? 이럴때 사용한다.
@discardableResult
func log (_ msg: String) -> String {
return "\(msg) is enetered"
}
즉, @discardableResult 는 결과와 관계없이 warning을 띄워주지마! 라는 의미를 가진다.