2016-10-12 10 views
0

に私はグループの私の配列に追加する解析からデータを取得しようとしているとき追加ません:迅速な配列のループ

var displayedGroups = [Groups]() 

グループは、構造体です:

struct Groups{ 
    let name: String? 
    let date: Date 
    let number: Int 
    let id: String 

    init(id: String, name: String, date: Date, number: Int) { 
     self.id = id 
     self.name = name 
     self.date = date 
     self.number = number 
    } 
} 

これは、関数であります私はデータを取得しようとしている:

func getDisplayedGroups() { 
     let query = PFQuery(className: "MeetUps") 
     print(PFUser.current()?.username) 
     query.whereKey("peeps", contains: PFUser.current()?.username) 
     query.findObjectsInBackground { (objects, error) in 
      if error != nil { 
       print(error) 
      } else if let objects = objects { 
       for meetUps in objects { 
        let peeps = (meetUps["peeps"] as! [String]) 
        let id = meetUps.objectId! 
        //let name = meetUps["meetUpName"] as? String 
        let date = meetUps["when"] as! Date 
        let group = Groups(id: id, name: " ", date: date, number: peeps.count) 
        print(group) 
        self.displayedGroups.append(group) 
       } 
      } 
     } 
     for i in displayedGroups { 
      print(i) 
     } 
     tableView.reloadData() 
    } 

ゼロがあるので、私は... let name = meetUps["meetUpName"]をコメントアウトしました解析ダッシュボードの「meetUpName」 - キー列の値

print(group)は動作し、ループごとに異なるグループを出力します。

しかし、このブロック:

for i in displayedGroups { 
       print(i) 
      } 

はまったく印刷されません:/と、そのような私のテーブルはdisplayedGroupsからデータをロードしていないよう。それは非同期と関係がありますか?すべきではないでしょうか?それらは同じブロックにあるためです。私は分かりません、助言してください。ありがとう!

+1

query.findObjectsInBackgroundは、メインスレッドではありません。 したがって、query.findObjectsInBackgroundがバックグラウンドで実行されている間、forループが実行されます。 displayedGroupsは常にnullになります – koropok

+0

'for'と' append'ではなく 'map'を使うほうがいいでしょう。 – Alexander

+0

@AlexanderMomchliovあなたはさらに気にしていますか? –

答えて

1

findObjectsInBackgroundは非同期に動作し、ループと行を入れてテーブルビューの完了ブロックにリロードします。

メインスレッドでテーブルビューを再読み込みする必要がある場合があります。以下の行は、バックグラウンドを終了する前に

for i in displayedGroups { 
     print(i) 
    } 
    tableView.reloadData() 

を実行するthread.Soそれが別のスレッドで実行されていない主に意味する名前がfindObjectsInBackgroundがバックグラウンドで実行される通りコード、から

... 
    for meetUps in objects { 
     let peeps = (meetUps["peeps"] as! [String]) 
     let id = meetUps.objectId! 
     //let name = meetUps["meetUpName"] as? String 
     let date = meetUps["when"] as! Date 
     let group = Groups(id: id, name: " ", date: date, number: peeps.count) 
     // print(group) 
     self.displayedGroups.append(group) 
    } 
    for i in displayedGroups { 
     print(i) 
    } 
    dispatch_async(dispatch_get_main_queue) { 
     self.tableView.reloadData() 
    } 
... 
+1

完了ブロックに自分のコードを挿入した後でも、dispatch_async(dispatch_get_main_queue)がなくても同じように思えます。あなたはなぜ私に説明しますか? –

+0

私は想像がつきませんが、 'findObjectsInBackground'もメインスレッドで動くかもしれません。バックグラウンド操作でUIに影響を与えるコードをメインスレッドにディスパッチすることは、常にプログラミングの習慣として優れています。 – vadian

+0

メインキューをいつ使用するのかよく分かりません。なぜなら、それを置くのが先行するコードが実行を完了する前にコードが実行されている可能性があるかどうかわからないからです。メインスレッドがどのように機能するのか、私を助ける読書を教えてくれますか? –

0

操作。

上記のコードを完成ブロック内に移動し、メインスレッドからデータを再ロードすることを忘れないでください。

編集機能:

func getDisplayedGroups() { 
let query = PFQuery(className: "MeetUps") 
print(PFUser.current()?.username) 
query.whereKey("peeps", contains: PFUser.current()?.username) 

query.findObjectsInBackground { (objects, error) in 
    if error != nil { 
     print(error) 
    } else if let objects = objects { 
     for meetUps in objects { 
      let peeps = (meetUps["peeps"] as! [String]) 
      let id = meetUps.objectId! 
      //let name = meetUps["meetUpName"] as? String 
      let date = meetUps["when"] as! Date 
      let group = Groups(id: id, name: " ", date: date, number: peeps.count) 
      print(group) 
      self.displayedGroups.append(group) 
     } 
    } 
    for i in self.displayedGroups { 
     print(i) 
    } 
    dispatch_async(dispatch_get_main_queue()) { 

    tableView.reloadData() 
    } 
} 
} 
} 
関連する問題