2017-05-10 2 views
0

私は完了ブロックの中からビューを表示する方法について固執しています。完了ブロックの外で同じコードを使用すると、ビューが表示されます。私はブロックが実行されていると確信していると私はdidSetにブロック内で使用する配列のsetNeedsDisplayを持っています。それで私は何が欠けているのですか?補完ハンドラ内のプログラムビューを表示するにはどうすればよいですか?

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を示す傾向があり、その場合、メイン・キューから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がnilであると、あなたのコードがクラッシュします、です。条件付きバインディングを使用して、クラッシュしないようにすることができます。

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

感謝の男、それは私の問題を解決し、UIのボトルネックについてのアドバイスをありがとう私はそれをチェックするつもりです – lestat

関連する問題