2016-05-06 15 views
0

私の解析データベースに接続し、すべてのユーザーオブジェクトを通過し、各カテゴリの文字列配列に名前と電子メールを追加する関数があります。スウィフト文字列が空のまま表示される

私はそれをviewWillAppear関数中に正しい値を持つとして配列を表示しますが、配列の行の量を返すまで来るとき、何らかの理由で空です。

何が原因で起こりますか?ここで

は、問題がcellForRowAtIndexPathが実行されていると移入表をviewWillAppear()実行する前に、配列にデータをフェッチされている私のコード

import UIKit 
import Parse 

class ContactTableViewController: UITableViewController { 

//arrays to hold user's name and email 
var users_names = [String]() 
var users_emails = [String]() 


override func viewWillAppear(animated: Bool){ 

    //Load user email and name 
    let query: PFQuery = PFUser.query()! 

    query.findObjectsInBackgroundWithBlock { 
     (objects:[PFObject]?, error:NSError?) -> Void in 
     if error == nil { 
      // The find succeeded. 
      print("Successfully retrieved \(objects!.count) users.") 
      // Do something with the found objects 
      if let user_objects = objects { 
       for user in user_objects { 
        self.users_names.append(user.valueForKey("name") as! String) 
        self.users_emails.append(user.valueForKey("email") as! String) 
       } 
      } 
     } else { 
      // Log details of the failure 
      print("Error: \(error!) \(error!.userInfo)") 
     } 
     self.users_names.removeAtIndex(1) 
     self.users_emails.removeAtIndex(1) 
     self.tableView.reloadData() 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    view.backgroundColor = UIColor(red: 0.8353, green: 0.9098, blue: 0.902, alpha: 1.0) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 



// MARK: - Table view data source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

//return number of rows in table 
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return users_names.count 
} 

です。

私はviewWillAppearの終わりにviewWillAppear

UIApplication.sharedApplication().beginIgnoringInteractionEvents() 

、その後.endIgnoringInteractionEvents()の開始時にこれを追加しようとしましたが、それはどちらかそれを修正しませんでした。

+0

すべての手順を追跡します。 'for user_objects'ブロックは実行されていますか? 'self.users_names.removeAtIndex(1)'の前にある配列の数は何ですか? – Ryan

+0

デバッグ時に正しい行の値は何ですか? – PeejWeej

+0

番号は9です。その後removeAtIndexを実行してリストから管理者の電子メールを削除して、自分自身に電子メールを送信することはできません.8時です。viewwillappearが処理を終了する前にcelfforrowatindexpath関数が実行されていることがわかりました。私はviewwillappearの前に実行からcellfforrowatindexpathを一時停止する方法がわかりません。 –

答えて

2

ブロックから、self.tableView.reloadData()を呼び出しています。このブロックは、バックグラウンドスレッドで実行されています。すべてのUI関連の操作は、メインスレッドで実行する必要があります。次のように再呼び出しするように呼び出しをラップしてください。

self.users_names.removeAtIndex(1) 
self.users_emails.removeAtIndex(1) 
dispatch_async(dispatch_get_main_queue()) { 
    self.tableView.reloadData() 
} 
+0

parseブロックからviewWillAppearブロックにtableview.reloadData()を移動しました。それにdispatch_asyncが追加されましたが、エラーは引き続き発生します。 –

+0

それはまだ解析ブロック内にある必要があります。 – PeejWeej

+0

あなたは岩です。それらのヒントを使って作業しました。 –

関連する問題