2017-05-10 5 views
0

완료 블록 내부에서보기를 표시하는 방법에 대해 고민하고 있습니다. 완료 블록 외부에서 동일한 코드를 사용하면보기가 표시됩니다. 블록이 실행되고있는 것입니다. 또한 블록 안에 사용할 배열의 경우 didSetsetNeedsDisplay이 있습니다. 그래서 나는 무엇을 놓치고 있습니까?완성 처리기 내에 프로그래밍 방식의보기를 표시하는 방법?

private var storeViews = [UIView](){ didSet{self.view.setNeedsDisplay()}} 

hrd.requestData(from: "somepage.php"){[weak self] (status:Bool,items:[[String:String]]?) in 
    if status 
    { 
     for var i in (0..<items!.count) 
     { 
      if let item = items?[i] 
      { 
       var shape = CGRect() 
       shape.size = CGSize(width: 50,height: 30) 

       let xPosStr = item["xPosition"] 
       let yPosStr = item["yPosition"] 

       let position = CGPoint(x: (self?.stringToFloat(xPosStr!))!,y: (self?.stringToFloat(yPosStr!))!) 

       shape.origin = position 
       let someView = UIView() 
       someView.frame = shape 
       someView.backgroundColor = UIColor.red 

       self?.view.addSubview(someView) 
       self?.someViews.append(someView) 
      } 
     } 
    } 
} 
+0

질문이 명확하지 않습니다. 어떤 종류의 견해를 보여주고 있습니까? 배열은 tableview를 가리키는 경향이 있는데,이 경우 main que에서 reloadData를 호출 할 필요가 없습니다. 우편 번호. –

+0

CGRect를 사용하고 있으며 배열에 배열을 저장하고 있으므로 배열에 setNeedsDisplay가있는 didSet이 있으므로 화면에 사각형이 있어야합니다. – lestat

+0

지금까지 가지고있는 코드를 추가 할 수 있습니까? –

답변

0

첫째, setNeedsDisplay 뷰 다시 그려야 할 때 그 것을보기를 표시합니다. 내부적으로는 drawRect입니다. 사용자 정의 구현을 사용하여 UIView 서브 클래스에서 drawRect을 대체하는 경우에만이 함수를 호출해야합니다. 비동기 API 요청을하고 있으며 완료 블록 안에 뷰를 추가한다고 생각합니다. UI 업데이트는 주 스레드에서만 수행되어야합니다. 당신이 루프에서보기를 추가하고 있기 때문에 당신은이 answer로 보일 수 있습니다,

DispatchQueue.main.async { 
    self?.view.addSubview(someView) 
} 

또한 메인 스레드에서 하위 뷰를 추가해야합니다. 병목 현상이 발생한 UI 업데이트에 대한 설명이 정말 있습니다. 내가 눈치

한가지 더

for var i in (0..<items!.count) 

items이 전무 인 경우, 코드가 충돌 것입니다. 조건부 바인딩을 사용하여 충돌이 발생하지 않도록 할 수 있습니다.

if let items = items{ 
    for item in items{ 
     //Do your stuff 
    } 
} 
+0

감사합니다. 문제가 해결되어 UI 병목 현상에 대한 조언을 주셔서 감사합니다. – lestat