본문 바로가기

iOS

[iOS] TableView에 뉴스제목 뿌리기에 사용된 메서드들 간단하게 공식문서를 훑어보자

# 카테고리

  • URLSession
  • dataTask(with:completionHandler:)
  • JSONSerialization
  • jsonObject(with:, options:)
  • reloadData()
  • resume()



# URLSession

관련된 네트워크 데이터 전송 작업 그룹을 조정하는 개체이다.

 

# dataTask(with:completionHandler:) 메서드 공문 훑기

- 정의

지정한 URL개체를 기반으로 URL의 내용을 검색하는 작업을 만들고, 완료됬을시 핸들러를 호출한다.

- Declaration

func dataTask(with request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask

- Parameter

  • request
    URL, 캐시정책, 요청유형, 본문 데이터 또는 본문 스트림등을 제공하는 URL요청 개체이다.
  • completionHandler
    로드 요청이 완료될때 호출한다. 이는 대리자 대기열에서 실행된다. 만일 여기에 nil을 전달할시 완료될때 세션 대리자 메서드만 호출되어 이 메서드를 dataTask(with:)와 같은 기능으로 사용된다.
    • data
      서버에서 반환하는 데이터이다.
    • response
      HTTP헤더 및 상태코드와 같은 응답 메터데이터를 제공하는 개채이다. HTTP또는 HTTPS요청을 수행하는 경우 반환된 객체는 실제로 HTTPURLResponse객체입니다.
    • error
      요청이 실패한 이유를 나타내는 오류 개체이거나 요청이 성공시에는 nil로 처리된다.

 

 

# JSONSerialization

  • JSON과 Foundation객체 사이에서 변환해주는 컨버터 역할이다. 즉, JSON <-> Foundation 서로 양방향으로 데이터 변환이 가능

Foundation객체를 JSON으로 변환하려면 객체에 다음 속성이 존재해야함

  • fragmentsAllowed옵션을 설정하지 않는 한 최상위 개체는 NSArray 또는 NSDictionary이다.
  • 모든 개체는 NSString, NSNumber, NSArray, NSDictionary 또는 NSNull의 인스턴스이다.
  • 모든 딕셔너리의 키는 NSString의 인스턴스이다.
  • 숫자는 NaN이나 무한대가 아니다.

isValidJSONObject(_:) 를 호출하거나 변환을 시도하는것은 JSONSerialization 클래스가 주어진 객체를 JSON데이터로 변환할 수 있는지 여부를 확인하는 확실할 방법임

 

# jsonObject(with:, options:)

  • 주어진 JSON데이터에서 Foundation 객체를 반환한다.

Declaration

 
class func jsonObject(with data: Data, options opt: JSONSerialization.ReadingOptions = []) throws -> Any

Parameter

  • data
    JSON데이터 전달하는 개체이다.
  • options
    JSON데이터를 읽고 Foundation객체를 생성하기 위한 옵션이다.
  • return Value
    데이터에 있는 JSON데이터의 Foundation개체를 반환하거나 오류발생시 nil을 반환함

Discussion(논의)

  • 데이터는 JSON사양에 나열된 5가지 지원 인코딩 중 하나여야 함(UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE) 데이터에는 BOM이 있을 수도있고 없을 수도있다. 구문 분석에 사용하는 가장 효율적인 인코딩은 UTF-8이므로 이메서드에 전달된 데이터 인코딩을 선택할 수 있는 경우 UTF-8을 사용합니다.
  • Swift에서 이 메서드는 선택사항이 아닌 결과를 반환하고 throw키워드로 표시되어있기에 실패시 오류를 던질 수 있다. Swift프로그래밍 언어의 오류처리 및 가져온 Cocoa오류 매개변수 정보에 설명된 대로 try식에서 이메서드를 호출하고 do문의 catch절에 있는 모든 오류를 처리한다.

예시코드

    func getNews() {
        guard let url = URL(string: NewsApi.url) else { return }
        
        let task = URLSession.shared.dataTask(with: url) { data, response, error in
            
            if let newsData = data {
                do {
                    guard let json = try JSONSerialization.jsonObject(with: newsData, options: []) as? [String: Any] else { return }

                    guard let articles = json["articles"] as? [[String: Any]] else { return }

                    self.newsData = articles

                    DispatchQueue.main.sync {
                        self.TableViewMain.reloadData()
                    }
                } catch {}
            }
        }
        task.resume()
     }

 

 

# reloadData()

  • TableView의 행과 섹션을 다시 로드합니다.

Discussion

  • 이 메서드를 호출함으로써 셀, 섹션 머리글 및 바닥글, 인덱스 배열 등을 포함해 테이블을 구성하는데 사용되는 데이터를 다시 로드한다. 효율성을 위해 TableView는 보이는 행만 다시 표시한다.
    다시 로드의 결과로 테이블의 축소되는 경우 오프셋을 조정한다.
    TableView의 대리자 또는 데이터 소스는 TableView Data를 완전히 다시 로드하기를 원할때 이메서드를 호출한다.
    특히 beginUpdates() 및 endUpdates() 호출로 구현된 애니메이션 블록 내에서 행을 삽입하거나 삭제하는 메서드에서 호출하면 안됩니다.

중요

hasUncommittedUpdate속성이 true인 경우 이 메서드를 호출하지마세요. 그렇게 하면 TableView가 데이터를 다시 로드하기전에 커밋되지않은 변경사항을 삭제하도록 합니다.

 

# resume()

  • 작업이 일시 중단된 경우 작업을 다시 시작합니다.

Discussion

  • 새로 초기화된 작업은 일시 중단된 상태에서 시작하므로 작업을 시작하려면 이메서드를 호출해야한다.

dequeueReusableCell(withIdentifier:for:)

  • 지정된 재사용 식별자에 대해 재사용 가능한 TableView Cell개체를 반환하고 테이블에 추가한다.

Parameter

  • identifier
    재사용할 Cell개체를 식별하는 문자열이다. 그래서 TableViewCell의 identifier을 식별한다. nil이면안됨
  • indexPath
    Cell의 위치를 지정하는 인덱스 경로이다. 항상 데이터 소스 개체에서 제공한 인덱스 경로를 지정하시오. 이 방법은 인덱스 경로를 사용하여 TableView에서 Cell의 위치에 따라 추가구성을 수행할 수 있다.
  • return Value
    연결된 재사용 식별자가 있는 UITableViewCell개체입니다. 이 메서드는 항상 유효한 Cell을 반환합니다.

중요

  • 스토리보드 파일에서 일치하는 식별자의 Cell로 지정해야한다. register메서드르 사용해 class또는 nib파일을 등록할 수도있지만 이는 dequeueReusableCell메서드 를 호출하기전에 등록해야함
  • 스토리보드 또는 nib파일에서 새 Cell을 생성할때 이 메서드는 Cell개체를 로드하고 init(coder:)메서드를 사용해 초기화시킨다.
  • 등록된 클래스에서 Cell을 생성할때 이 메소드를 셀을 생성하고 init(style:reuseldentifier:)메서드를 호출하여 초기화시킨다.

 

reference