API 호출의 데이터를 Swift의 tableviewcell에 추가하는 방법

JS_is_awesome18

API 호출의 값을 tableview의 셀로 반환하는 기본 앱을 설정하고 있습니다. 온라인에서 본 다양한 예제는 모델에서 직접 디코딩하도록 서비스 파일을 구성합니다. 그러나 가능한 경우 ViewModel에서 디코딩하도록 서비스 파일을 설정하려고합니다. Xcode에서 앱을 실행할 때 오류가 발생하지 않지만 테이블 뷰에 빈 셀이 표시됩니다. 나는 여전히 Swift의 API 호출에 상당히 익숙합니다. viewModel을 사용하는 동안 API 호출 값을 셀에 반환하도록 구성하는 방법은 무엇입니까? 아래 내 코드를 참조하십시오.

내 WebService 파일에서 다음과 같이 URLSession을 설정했습니다.

class WebService {
        
    func getStocks(completion: @escaping (([SymbolViewModel]?) -> Void)) {

        guard let url = URL(string: "https://island-bramble.glitch.me/stocks") else {
            fatalError("URL is not correct")
        }

        URLSession.shared.dataTask(with: url) { data, response, error in

            guard let data = data, error == nil else {
                completion(nil)
                return
            }

            let symbols = try? JSONDecoder().decode([SymbolViewModel].self, from: data)
            symbols == nil ? completion(nil) : completion(symbols)

        }.resume()

    }
}

ViewModel은 다음과 같이 설정됩니다.

struct SymbolViewModel:Decodable {
 
    let stockSymbol: Symbol
    
    var symbol: String {
        return self.stockSymbol.symbol.uppercased()
    }
    
    var price: String {
        return String(format: "%.2f", self.stockSymbol.price)
    }
}

모델:

struct Symbol: Decodable {
    let symbol: String
    let price: Double
}

TableView 함수와 TableViewCell이있는 ViewController :

class ViewController: UIViewController {
    
    let webService = WebService()
    var symbols = [SymbolViewModel]()
    
    @IBOutlet var tableView: UITableView!
        
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let nib = UINib(nibName: "TableViewCell", bundle: nil)
        tableView.register(nib, forCellReuseIdentifier: "TableViewCell")
        tableView.delegate = self
        tableView.dataSource = self
                
        webService.getStocks { symbols in
            if let symbols = symbols {
                DispatchQueue.main.async {
                    self.symbols = symbols
                }
            }
        }
        self.tableView.reloadData()
    }
}

class TableViewCell: UITableViewCell {
    
    @IBOutlet var mySymbol: UILabel!
    @IBOutlet var myPrice: UILabel!

}

extension ViewController: UITableViewDelegate, UITableViewDataSource {
    /// tableView functions
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return symbols.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TableViewCell.self), for: indexPath) as! TableViewCell
        
        cell.mySymbol.text = symbols[indexPath.row].symbol
        cell.myPrice.text = symbols[indexPath.row].price

        return cell
    }
}

에러 메시지:

keyNotFound(CodingKeys(stringValue: "stockSymbol", intValue: nil), Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription: "No value associated with key CodingKeys(stringValue: \"stockSymbol\", intValue: nil) (\"stockSymbol\").", underlyingError: nil))
0 elements

Vadian

모델이 잘못되었습니다.

우선 계산 된 속성을 선언 CodingKeys하는 경우 계산 된 속성이 디코딩되지 않도록 추가 해야합니다. 이것이 오류의 주된 이유이지만 더 많은 것이 있습니다.

JSON은 (1 차원) 사전의 배열이며 해당 모델은 다음과 같습니다.

struct StockSymbol : Decodable {
    
    let symbol : String
    let price : Double
    
    private enum CodingKeys : String, CodingKey { case symbol, price }
    
    var priceAsString: String {
        return String(format: "%.2f", price)
    }
}

다른 구조체 Symbol는 필요하지 않습니다.

디코딩

do {
    let symbols = try? JSONDecoder().decode([StockSymbol].self, from: data)
    completion(symbols)
} catch {
    print(error)
    completion(nil)
}
 

완료 핸들러 내부에서 테이블 뷰를 다시로드해야합니다.

webService.getStocks { symbols in
    if let symbols = symbols {
        DispatchQueue.main.async {
            self.symbols = symbols
            self.tableView.reloadData()
        }
    }
}
   

더 정교한 방법은 Result유형이며 유효한 데이터 또는 오류를 반환합니다.

class WebService {
    
    func getStocks(completion: @escaping (Result<[StockSymbol],Error>) -> Void) {
        
        guard let url = URL(string: "https://island-bramble.glitch.me/stocks") else {
            fatalError("URL is not correct")
        }
        
        URLSession.shared.dataTask(with: url) { data, response, error in
            if let error = error { completion(.failure(error)); return }
            completion( Result {try JSONDecoder().decode([StockSymbol].self, from: data!)})
        }.resume()
        
    }
}

그리고 그것을 불러

webService.getStocks { [weak self]  result in
    switch result {
        case .success(let symbols):
            DispatchQueue.main.async {
                self?.symbols = symbols
                self?.tableView.reloadData()
            }
        case .failure(let error): print(error) // or show the error to the user
    }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

ajax 호출의 데이터를 ul 내부의 div에 추가하는 방법

분류에서Dev

Swift의 anyObject에서 데이터를 추출하는 방법

분류에서Dev

Javascript-두 개의 API Ajax 호출에서 하나의 함수로 데이터를 전달하는 방법

분류에서Dev

React-REST API의 데이터에 로컬 데이터를 추가하는 방법은 무엇입니까?

분류에서Dev

JQUERY의 특정 DIV에 데이터를 추가하는 방법

분류에서Dev

루프의 열에 데이터를 추가하는 방법

분류에서Dev

첫 번째 API 호출의 데이터를 사용하고 두 번째 API 호출에서 사용하는 방법은 무엇입니까?

분류에서Dev

Angular의 Observable에서 데이터를 추출하는 방법

분류에서Dev

VUE의 다른 API에서 추가 JSON 데이터를로드하는 방법은 무엇입니까?

분류에서Dev

API의 Json 데이터에서 데이터를 가져 오는 방법

분류에서Dev

openfire rest API의 restclient.entity.UserEntities에서 데이터를 추출하는 방법은 무엇입니까?

분류에서Dev

Fb.api의 데이터를 mysql에 저장하는 방법

분류에서Dev

어떻게 나머지 API를 호출하여 그 API의 데이터를 사용하는 방법?

분류에서Dev

asp.net API에서 Ajax 호출에 의해 요청 된 데이터 유형을 확인하는 방법

분류에서Dev

컬렉션의 기존 모델에 외부 API의 추가 데이터를 추가하는 방법은 무엇입니까?

분류에서Dev

테이블의 데이터를 문자열에 추가하는 방법

분류에서Dev

JQuery의 <tr> 테이블에 데이터를 추가하는 방법

분류에서Dev

Swift : 개체 목록에서 개체의 변수에 데이터를 추가하는 방법

분류에서Dev

괄호로 시작하고 끝나는 API를 사용하여 Swift 3.1의 API에서 구문 분석 데이터를 만드는 방법

분류에서Dev

API 검색에서 반환 된 항목 목록의 ID를 사용하여 API에서 일부 데이터를 추출하는 방법이 있습니까?

분류에서Dev

Swift-View Controller에서 사용할 모델의 API 호출에서 json 객체를 반환하는 방법

분류에서Dev

VBA의 문자열에서 데이터를 추출하는 최적의 방법

분류에서Dev

Firebase 데이터베이스의 목록에 데이터를 추가하는 가장 좋은 방법

분류에서Dev

로그인을 위해 C #의 변수에 데이터베이스의 데이터를 추가하는 방법

분류에서Dev

While 루프의 데이터를 빈 DataFrame에 추가하는 방법

분류에서Dev

Qt의 기존 json 파일에 json 데이터를 추가하는 방법

분류에서Dev

Odoo13의 POS 주문에 데이터를 추가하는 방법

분류에서Dev

목록의 특정 요소 뒤에 데이터를 추가하는 방법

분류에서Dev

PHP mysql의 기존 데이터에 URL 슬러그를 추가하는 방법

Related 관련 기사

  1. 1

    ajax 호출의 데이터를 ul 내부의 div에 추가하는 방법

  2. 2

    Swift의 anyObject에서 데이터를 추출하는 방법

  3. 3

    Javascript-두 개의 API Ajax 호출에서 하나의 함수로 데이터를 전달하는 방법

  4. 4

    React-REST API의 데이터에 로컬 데이터를 추가하는 방법은 무엇입니까?

  5. 5

    JQUERY의 특정 DIV에 데이터를 추가하는 방법

  6. 6

    루프의 열에 데이터를 추가하는 방법

  7. 7

    첫 번째 API 호출의 데이터를 사용하고 두 번째 API 호출에서 사용하는 방법은 무엇입니까?

  8. 8

    Angular의 Observable에서 데이터를 추출하는 방법

  9. 9

    VUE의 다른 API에서 추가 JSON 데이터를로드하는 방법은 무엇입니까?

  10. 10

    API의 Json 데이터에서 데이터를 가져 오는 방법

  11. 11

    openfire rest API의 restclient.entity.UserEntities에서 데이터를 추출하는 방법은 무엇입니까?

  12. 12

    Fb.api의 데이터를 mysql에 저장하는 방법

  13. 13

    어떻게 나머지 API를 호출하여 그 API의 데이터를 사용하는 방법?

  14. 14

    asp.net API에서 Ajax 호출에 의해 요청 된 데이터 유형을 확인하는 방법

  15. 15

    컬렉션의 기존 모델에 외부 API의 추가 데이터를 추가하는 방법은 무엇입니까?

  16. 16

    테이블의 데이터를 문자열에 추가하는 방법

  17. 17

    JQuery의 <tr> 테이블에 데이터를 추가하는 방법

  18. 18

    Swift : 개체 목록에서 개체의 변수에 데이터를 추가하는 방법

  19. 19

    괄호로 시작하고 끝나는 API를 사용하여 Swift 3.1의 API에서 구문 분석 데이터를 만드는 방법

  20. 20

    API 검색에서 반환 된 항목 목록의 ID를 사용하여 API에서 일부 데이터를 추출하는 방법이 있습니까?

  21. 21

    Swift-View Controller에서 사용할 모델의 API 호출에서 json 객체를 반환하는 방법

  22. 22

    VBA의 문자열에서 데이터를 추출하는 최적의 방법

  23. 23

    Firebase 데이터베이스의 목록에 데이터를 추가하는 가장 좋은 방법

  24. 24

    로그인을 위해 C #의 변수에 데이터베이스의 데이터를 추가하는 방법

  25. 25

    While 루프의 데이터를 빈 DataFrame에 추가하는 방법

  26. 26

    Qt의 기존 json 파일에 json 데이터를 추가하는 방법

  27. 27

    Odoo13의 POS 주문에 데이터를 추가하는 방법

  28. 28

    목록의 특정 요소 뒤에 데이터를 추가하는 방법

  29. 29

    PHP mysql의 기존 데이터에 URL 슬러그를 추가하는 방법

뜨겁다태그

보관