2017-04-07 21 views
1

ここに私の状況です(私はiOSの開発者で始まっていることに注意してください:))。swift/iosの非同期ロードイメージ?

データがfirebaseからフェッチされるフィードのリストがあります。各フィードは、テーブルビューでイメージとタイトルを取得します。

ユーザーがインターネットに接続せずにアプリに戻っても、その前に表示されたデータを表示する方法を探しています。

import UIKit 
import FirebaseAuth 
import FirebaseDatabase 
import FirebaseStorage 
import SwiftKeychainWrapper 
import SwiftyJSON 

var posts = [Post]() 
var selectedIndexPath: Int = 10 

class FeedVC: UIViewController, UITableViewDataSource, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITableViewDelegate { 

@IBOutlet weak var feedTableView: UITableView! 

private var readPosts: ObserveTask? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    feedTableView.dataSource = self 
    feedTableView.delegate = self 

    readPosts = Post.observeList(from: Post.parentReference.queryOrdered(byChild: "privacy").queryEqual(toValue: false)) 

    { 
     observedPosts in 

     posts = observedPosts.reversed() 
     self.feedTableView.reloadData() 
    } 
} 

override var prefersStatusBarHidden: Bool { 
    return true 
} 

func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return posts.count 
} 

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = self.feedTableView.dequeueReusableCell(withIdentifier: "MessageCell")! as UITableViewCell 


let imageView = cell.viewWithTag(1) as! UIImageView 



    let titleLabel = cell.viewWithTag(2) as! UILabel 
    let linkLabel = cell.viewWithTag(3) as! UILabel 

    titleLabel.text = posts[indexPath.row].title 
    titleLabel.numberOfLines = 0 

    linkLabel.text = posts[indexPath.row].link 
    linkLabel.numberOfLines = 0 



    Storage.getImage(with: posts[indexPath.row].imageUrl){ 
     postPic in 
     imageView.image = postPic 
    } 

    return cell 

} 


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    guard posts[indexPath.row].title != "COMING SOON" else { 
     return 
    } 
      selectedIndexPath = indexPath.row 
      self.performSegue(withIdentifier: "push", sender: self) 
      self.feedTableView.reloadData() } 


} 

どのようにこれを行うことが可能です:

現在、私はデータを表示するには、この使用していますか?私はNSUR関数から見てきました。これは良いスタートですか?

ありがとうございました!データセットが大きくなりすぎた場合には、パフォーマンスに影響を与える可能性があるので、あなたはおそらく、コアデータにこれらの画像を保存したくない場合は、画像や

を格納するための

+0

あなたは私の答えを試しましたか? –

答えて

1

使用コアデータ。画像をファイルに書き込む方がよい。

NSData *pngData = UIImagePNGRepresentation(image); 

これは、キャプチャした画像のPNGデータを取り出します。ここからファイルに書き込むことができます:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsPath = [paths objectAtIndex:0]; //Get the docs directory 
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"image.png"]; //Add the file name 
[pngData writeToFile:filePath atomically:YES]; //Write the file 

後で読む方法は同じです。私たちは上記の行ったようそして、パスを構築します。

NSData *pngData = [NSData dataWithContentsOfFile:filePath]; 
UIImage *image = [UIImage imageWithData:pngData]; 

をあなたはおそらく何をしたいだろうすると、そのコードはどこにでも散らばったくないので、あなたのためのパス文字列を作成する方法を作るです。それは次のようになりますと便利です

- (NSString *)documentsPathForFileName:(NSString *)name 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 
    NSString *documentsPath = [paths objectAtIndex:0]; 

    return [documentsPath stringByAppendingPathComponent:name]; 
} 

希望を。

関連する問題