2016-09-09 9 views
0

更新を入手する方法を見つけるのが難しく、facebookProfileUrlを使用して、セル内のイメージビューにイメージを置くことができます。コードでわかるように、私は自分のページの一番上にあるvar facebookProfileUrlを使ってインスタンスを作成しました。コードの最後に、facebookProfileUrlが空であれば、それがそうであることがわかります。これがこのコードがしていることです。コードの途中でfacebookProfileUrlを変更しても、何も起こりません。これを修正するにはどうすればよいですか?前述したように更新された変数をIBAction swiftの外に取得する

var facebookProfileUrl = "" // THIS IS BEFORE viewDidLoad 



@IBAction func addToFeed(sender: AnyObject) { 
    let accessToken = FBSDKAccessToken.currentAccessToken() 
    if(accessToken != nil) //should be != nil 
    { 
     let req = FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"id"], tokenString: accessToken.tokenString, version: nil, HTTPMethod: "GET") 
     req.startWithCompletionHandler({ (connection, result, error : NSError!) -> Void in 
      if(error == nil) 
      { 
       let userId: String? = result.valueForKey("id") as? String 
       let userID = userId 
       self.facebookProfileUrl = "http://graph.facebook.com/\(userID)/picture?type=large" // HERE I AM CHANGING THE VARIABLE 

       let feed = Sweet(content: feedContent, addedByUser: name!, profilePhoto: self.facebookProfileUrl) 
       let feedRef = self.dbRef.child(feedContent.lowercaseString) 

       feedRef.setValue(feed.toAnyObject()) 

      } 
      else 
      { 
       print("error \(error)") 
      } 
     }) 
    } 
} 





override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell:updateTableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! updateTableViewCell 


    let update = updates[indexPath.row] 


    cell.nameLabel.text = update.addedByUser 
    cell.updateLabel.text = update.content 


    if (facebookProfileUrl != "") { 
     if let url = NSURL(string: facebookProfileUrl) { 
      if let data = NSData(contentsOfURL: url) { 
       cell.picView.image = UIImage(data: data) 
      } 
     } 
    } else { 
     print("Empty facebookProfileUrl") // THIS ONE IS PRINTED 
    } 



    return cell 
} 
+1

補完ハンドラ内のテーブルのreloadData()を呼び出します。 –

+0

私はアクションの外で更新されたfacebookProfileUrlにどのようにアクセスしますか? :) –

+0

req.startWithCompletionHandlerは非同期であり、最初に関数を呼び出しても、cellForRowAtIndexPathの後にその呼び出しを完了します。あなたのコードは座っておらず、あなたのネットワーク要求が完了するのを待つでしょう。 reloadData()を呼び出すと、値がクロージャーで設定された後に再びcellForRowAtIndexPathがトリガーされます。 – Dare

答えて

0

あなたは(私はエラーの場合== nilを条件に、最後の行としてお勧めします)完了ブロックに

self.tableView.reloadData()を呼び出す必要があり、これはつまり、非同期呼び出しですそのブロック内のコードreq.startWithCompletionHandler({ ... })は、サーバーが応答した後に呼び出されます。この時点では、tableViewがすでにデータをロードしている可能性があります(つまり、現在画面に表示されているすべてのセルに対してcellForRowAtIndexPathが呼び出されています)。

注意してください!私はあなたが達成しようとしていることを正確にはわかりません。私はあなたのコードをすべて見ていませんが、あなたがこれをやっているように、すべてのセルは同じURLを持っています。それ以上の情報なしでこれを行うより良い方法をお勧めするのは難しいですが、注意してください。

+0

また、一般的にSwiftスタイルにはif文の括弧は含まれません。これは、Cスタイルのforループと同様に、今後廃止される可能性があります。私はそれが意見より多くの意見/アドバイスより答えであるので、これをコメントとして入れます –

+0

それはすばらしいアドバイスとすばらしい探検です!私のコードはそれ以上のもので、ifエラー部分の最後の行にコードを追加した後、完了ブロックの何も変更されていません:(それは本当に私を悩ましています! –

+0

私はidです取得しようとしていたオプション、それは写真wouldnt表示された理由だった:)あなたの時間をありがとう、申し訳ありません、私はそれを無駄に! –

関連する問題