Today’s Goal

  1. Learn LBTA Youtube ep 14

LBTA Youtube ep 14

How to fetch Multiple Feeds

FeedCell에 videos라는 Video타입 array가 있고 각 feed의 cell에 대한 정보를 나타내고 있다.

그 중 핵심인 fetchVideo()에 주목하자.

####collectionView for each tap

총 4개의 탭 중 FeedCell은 메인 홈 탭 나머지 탭의 cocoa touch class로 FeedCell을 상속하여 만들어준다.

두번째탭인 TrendingCell을 기준으로 설명

HomeController에서 각각의 탭에서도 collectionView를 사용할 것이므로 register해준다.

collectionView?.register(TrendingCell.self, forCellWithReuseIdentifier: trendingCellId)

Identifier는 각각 String으로 따로 만들어준다.

if indexPath.item == 1 {
    return collectionView.dequeueReusableCell(Id: trendingCellId, for: indexPath)
}

cellForItem에서 indexPath.item으로 분류해줘서 각 탭별로 collectionView가 나오도록 해준다.

####ApiService.swift

ApiService.swift에서 fetchVideo를 똑같이 복붙한다. 그리고 json 주소를 변경해준다.

class TrendingCell: FeedCell {
    override func fetchVideos() {
        ApiService.sharedInstance.fetchTrendingFeed { (videos) in
            self.videos = videos
            self.collectionView.reloadData()
        }
    }
}

다른 탭들의 cell도 똑같이 해준다.

func fetchFeedForUrlString(urlString: String, completion: @escaping ([Video]) -> ()) {
        guard let url = URL(string: urlString) else { return }
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            
            guard let data = data else {return}
            
            do {
                let json = try JSONDecoder().decode([Video].self, from: data)
                
                DispatchQueue.main.async {
                    completion(json)
                }
                
            } catch let jsonError {
                print(jsonError)
            }
            
            }.resume()
    }

3개의 fetchVideo()함수의 차이점은 json주소의 끝부분이기 때문에 함수를 하나 추가하여 처리해준다.

    static let sharedInstance = ApiService()
    
    let baseUrl = "https://s3-us-west-2.amazonaws.com/youtubeassets"
    
    func fetchVideos(completion: @escaping ([Video]) -> ()) {
        fetchFeedForUrlString(urlString: "\(baseUrl)/home.json", completion: completion)
    }
    
    func fetchTrendingFeed(completion: @escaping ([Video]) -> ()) {
        fetchFeedForUrlString(urlString: "\(baseUrl)/trending.json", completion: completion)
    }
    
    func fetchSubscriptionFeed(completion: @escaping ([Video]) -> ()) {
        fetchFeedForUrlString(urlString: "\(baseUrl)/subscriptions.json", completion: completion)
    }

Instance처럼 static을 만들어서 각 cell에서 여기로 접근

####HomeController Refactoring

cellForItem에서 refactoring해준다.

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        
        let identifier: String
        
        if indexPath.item == 1 {
            identifier = trendingCellId
        } else if indexPath.item == 2 {
            identifier = subscriptionCellId
        } else {
            identifier = cellId
        }
        
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath)
        return cell
    }

함수 안에 있는 let identifier라는 번수는 함수가 호출 될 때 마다 실행되고 사라지는 변수기 때문에 let으로 해도 괜찮다.

태그:

카테고리:

업데이트:

댓글남기기