이번에는 패캠에서 배운걸 토대로 유튜브에 ios Project를 검색해서 나온 뉴스 어플을 만들어봤다ㅎㅎ
검색기능은 없는 간단한 뉴스 어플이다.
newsapi.org에서 api를 가져와서 하루 20개의 뉴스를 보여준다.
화면을 키게 되면 각 뉴스기사들의 헤드라인과 설명 그리고 옆에 이미지를 보여준다
뉴스를 클릭하면 safari로 연동되어있어서 뉴스의 자세한 웹사이트로 넘어간다
삼 분할해서 만들었다고 보면 된다
화면 전체에 대한 틀을 테이블뷰를 사용해서 잡고 뉴스를 누르면 safari로 넘어가게 설정해두었다.
API를 어떤 방식으로 부를지 다른 클래스에 전달은 어떤방식으로 할지 정리해두었다.
타이틀과 간단한 설명 그리고 이미지를 Cell에 Custom해서 들어갈 수 있게 설정해두었다.
생성자가 여러차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다
final class APICaller {
static let shared = APICaller()
private init(){}
}
static으로 다른 클래스에서도 전역으로 객체를 생성할 수 있게 만들어줬다!!
이렇게 하면 클래스는 최초 생성되기 전까지는 메모리에 올라가지도 않고 Dispatch_one(1회만 실행하는것을 보장)도 자동 적용된다
장점: 전역인스턴스여서 다른 클래스들과 자원공유가 쉽다!!
단점: 싱글객체가 너무 많은 일을 하면 다른 클래스들과 인스턴트들간 결합도가 높아져서 수정과 테스트가 어려워진다
DBCP(DataBaseConnectionPool)처럼 공통된 객체를 여러개 생성해서 사용해야하는 상황에서 많이 사용!!
DBCP란 dbConnection을 Pool에 저장하고 필요할때마다 가져다가 쓰는걸 뜻한다 -> 메모리효율증가!!
private let newsTitleLabel: UILabel = {
let label = UILabel()
label.font = .systemFont(ofSize: 22, weight: .semibold)
return label
}
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?){
super.init(style: style , reuseIdentifier: reuseIdentifier)
contentView.addSubView(newTitleLabel)
}
override func layoutSubviews(){
newsTitleLabel.frame = CGRect(
x: 10,
y: 0,
width: contentView.frame.size.width - 170,
height: 70
)
}
override func prepareForReuse(){
super.prepareForReuse()
newsTitleLabel.text = nil
}
func configure(with viewModel: NewsTable){
newsTitleLabel.text = viewModel.title
}
커스텀 Cell에 들어가는 타이틀을 작성했다
일단 타이틀의 형태를 즉 크기나 모양을 구성한다
위치를 추가한다 CGRect로
어디서 타이틀에 들어갈 값을 받을지 정한다.
addSubView로 추가한다 --> 테이블 뷰안에 cell이니까 contentView.addSubView로 작성했다.