func collectionView는 dataTask () 메소드가 완료되기 전에 호출됩니다.

자레드 하트

내 웹 서비스를 호출하여 JSON 데이터를 반환하면 UICollectionView에서 셀을 채우는 데 사용됩니다. 셀 수를 결정하기 위해 JSON 배열에 반환 된 항목 수를 계산합니다. 그러나 문제는 내 dataTask () 함수가 완료되기 전에 내 collectionView () 함수가 호출된다는 것입니다 (내 추측은 dataTask ()가 비동기 적이라는 것입니다), 차례로 nil 값 (jsonCount)에 액세스하고 있음을 자세히 설명하는 오류를 제공합니다. TestController.swift의 변수). 다양한 completeHandlers 및 반환 값을 가지고 놀아 보았지만 작동하지 않습니다. 제발 올바른 방향으로 안내해 주시겠습니까?

귀하의 도움 / 의견은 대단히 감사합니다.

HomeModel.swift

class func getPostings(completionHandler: @escaping (_: Any) -> ()) {
        let url: URL = URL(string: "url")!
        let request: URLRequest = URLRequest(url: url)
        let task = URLSession.shared.dataTask(with: request) {data, 
                   response, error in
                guard error == nil else {
                print(error!)
                completionHandler("Failed")
                return
                }
        let httpResponse = response as! HTTPURLResponse
        let statusCode = httpResponse.statusCode

        if statusCode == 200 {
            let json = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [[String: Any]]
            completionHandler(json!)
        }
    }
    task.resume()

TestController.swift

var jsonCount: Int?
var jsonData: [[String: Any]]?

override func viewDidLoad() {
    super.viewDidLoad()

    HomeModel.getPostings(completionHandler: {(response: Any) -> Void in
        guard response as? String != "Failed" else {
            //Code to send a pop-up alert to the user
            return
        }
        self.jsonData = response as? [[String: Any]]
        self.jsonCount = (self.jsonData?.count)!
    })
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return jsonCount
}
무자 히드

CollectionView또는 TableView기본적으로 ViewDidLoad메서드에서 다시로드합니다 . 그러나 서버에서 무언가를 다운로드하면 Main Thread에서 다운로드 작업 업데이트 UI가 완료됩니다.

HomeModel.getPostings(completionHandler: {(response: Any) -> Void in
        guard response as? String != "Failed" else {
            //Code to send a pop-up alert to the user
            return
        }
        self.jsonData = response as? [[String: Any]]
        self.jsonCount = (self.jsonData?.count)!
        DispatchQueue.main.async {
            // Update UI on Main Thread
            collectionView.reloadData()
        }
    })

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

ajax 호출이 완료되기 전에 메소드가 실행 중입니다.

분류에서Dev

firebase 메소드가 reactjs를 완료하기 전에 다른 메소드가 실행되는 문제

분류에서Dev

다른 사람이 완료되기 전에 호출되는 메서드

분류에서Dev

함수가 완료되기 전에 서버에서 Meteor 메서드를 호출하면 반환됩니다.

분류에서Dev

nodejs는 결과를 반환하기 전에 비동기 func가 완료되기를 기다리지 않습니다.

분류에서Dev

.then은 다음 메소드를 호출하기 전에 setState가 완료되기를 기다 립니까?

분류에서Dev

onAnimationComplete는 애니메이션이 완료되기 전에 실행됩니다.

분류에서Dev

완료되기 전에 페이지를 종료하면 URLSession.shared.dataTask를 어떻게 취소 할 수 있습니까?

분류에서Dev

웹 사이트로드가 완료되기 전에 onPageFinished 메서드가 호출됩니까?

분류에서Dev

소스 Observable이 완료되기 전에`merge` 연산자가 완료되는 이유는 무엇입니까?

분류에서Dev

ExtJS : Ext.Ajax.request가 완료되기 전에도 Next 메소드가 실행됩니다.

분류에서Dev

등록 이벤트가 완료되기 전에 서비스 워커 설치 이벤트가 호출됩니다.

분류에서Dev

iprocess가 완료되기 전에 대기가 계속됩니다.

분류에서Dev

계속하기 전에 객체 생성자 내부의 메서드가 완료되기를 기다리는 중

분류에서Dev

초기화가 완료되기 전에 싱글 톤에서 메서드 호출

분류에서Dev

Jogl, display ()는 init ()가 끝나기 전에 호출됩니다.

분류에서Dev

VBA가 완료되기 전에 중지됩니다.

분류에서Dev

POST 호출이 전송되고 사용자가 완료되기 전에 브라우저를 종료하면 완료됩니까?

분류에서Dev

이벤트가 완료되기 전에 jQuery 애니메이션 완료가 실행됩니다.

분류에서Dev

실행이 완료되기 전에 메서드가 반환됩니까?

분류에서Dev

이벤트가 호출되기 전에 호출됩니다.

분류에서Dev

빌드 메서드가 호출되기 전에 데이터를로드하기 위해 비동기 메서드 완료를 기다리는 방법은 무엇입니까?

분류에서Dev

함수를 호출하는 for 루프가 함수가 호출되기 전에 종료됩니까?

분류에서Dev

UIAlertController는 viewDidAppear가 호출을 완료 한 경우에만 표시됩니다.

분류에서Dev

React JS componentDidMount 라이프 사이클 메소드에서 호출 된 경고는 이후가 아닌 초기 렌더링 전에 팝업됩니다.

분류에서Dev

Node.js : 노드는 종료하기 전에 항상 setTimeout ()이 완료되기를 기다리나요?

분류에서Dev

내 React-Redux 코드는 이전 함수가 완료되기 전에 함수를 실행 중입니다.

분류에서Dev

그때의 함수는 종료되기 전에 호출됩니다.

분류에서Dev

요청 스레드가 완료되기 전에 Spring RequestContextListenerrequestDestroyed가 호출되었습니다.

Related 관련 기사

  1. 1

    ajax 호출이 완료되기 전에 메소드가 실행 중입니다.

  2. 2

    firebase 메소드가 reactjs를 완료하기 전에 다른 메소드가 실행되는 문제

  3. 3

    다른 사람이 완료되기 전에 호출되는 메서드

  4. 4

    함수가 완료되기 전에 서버에서 Meteor 메서드를 호출하면 반환됩니다.

  5. 5

    nodejs는 결과를 반환하기 전에 비동기 func가 완료되기를 기다리지 않습니다.

  6. 6

    .then은 다음 메소드를 호출하기 전에 setState가 완료되기를 기다 립니까?

  7. 7

    onAnimationComplete는 애니메이션이 완료되기 전에 실행됩니다.

  8. 8

    완료되기 전에 페이지를 종료하면 URLSession.shared.dataTask를 어떻게 취소 할 수 있습니까?

  9. 9

    웹 사이트로드가 완료되기 전에 onPageFinished 메서드가 호출됩니까?

  10. 10

    소스 Observable이 완료되기 전에`merge` 연산자가 완료되는 이유는 무엇입니까?

  11. 11

    ExtJS : Ext.Ajax.request가 완료되기 전에도 Next 메소드가 실행됩니다.

  12. 12

    등록 이벤트가 완료되기 전에 서비스 워커 설치 이벤트가 호출됩니다.

  13. 13

    iprocess가 완료되기 전에 대기가 계속됩니다.

  14. 14

    계속하기 전에 객체 생성자 내부의 메서드가 완료되기를 기다리는 중

  15. 15

    초기화가 완료되기 전에 싱글 톤에서 메서드 호출

  16. 16

    Jogl, display ()는 init ()가 끝나기 전에 호출됩니다.

  17. 17

    VBA가 완료되기 전에 중지됩니다.

  18. 18

    POST 호출이 전송되고 사용자가 완료되기 전에 브라우저를 종료하면 완료됩니까?

  19. 19

    이벤트가 완료되기 전에 jQuery 애니메이션 완료가 실행됩니다.

  20. 20

    실행이 완료되기 전에 메서드가 반환됩니까?

  21. 21

    이벤트가 호출되기 전에 호출됩니다.

  22. 22

    빌드 메서드가 호출되기 전에 데이터를로드하기 위해 비동기 메서드 완료를 기다리는 방법은 무엇입니까?

  23. 23

    함수를 호출하는 for 루프가 함수가 호출되기 전에 종료됩니까?

  24. 24

    UIAlertController는 viewDidAppear가 호출을 완료 한 경우에만 표시됩니다.

  25. 25

    React JS componentDidMount 라이프 사이클 메소드에서 호출 된 경고는 이후가 아닌 초기 렌더링 전에 팝업됩니다.

  26. 26

    Node.js : 노드는 종료하기 전에 항상 setTimeout ()이 완료되기를 기다리나요?

  27. 27

    내 React-Redux 코드는 이전 함수가 완료되기 전에 함수를 실행 중입니다.

  28. 28

    그때의 함수는 종료되기 전에 호출됩니다.

  29. 29

    요청 스레드가 완료되기 전에 Spring RequestContextListenerrequestDestroyed가 호출되었습니다.

뜨겁다태그

보관