2016-10-24 2 views
0

だから私はここで混合祝福に遭遇しました。私のアプリは予想以上に成長しており、パフォーマンスが低下し始めていることに気付きました。それはソーシャルメディアであり、ユーザーデータはFirebaseに保存されます。 viewDidLoadで、私はユーザーデータをTable Viewに解析しました。私は、Firebaseからデバイスにロードする必要のある数百のレコードを持っています。そして今、テーブルビュー(100)に表示されるユーザーの数を制限したいと思います。迅速にアレイ容量を制限する方が効率的でしょうか?

私の質問のために:
どちらが良いパフォーマンスオプションですか?単にnumberOfRowsInSectionを100に制限するだけですか?またはインデックス100の後にユーザーアレイ内のすべての要素を削除しますか?

これが第2の選択肢であれば、どうすればいいのですか?残念ながら、私はそれらを並べ替えることができるように、最初に配列に格納されているユーザーデータが必要ですが、ソート後、配列内のすべての要素を特定のインデックスの後に削除したいと思います。 (私はこれが不思議そうだと知っている、私は後でコードを修正し、これをよりスムーズにする)。

ありがとうございました!

+2

パフォーマンスに関する問題はありますか?あなたは、問題がどこから来ているのかを判断するためにアプリでプロファイリングしましたか? 'UITableView'はテーブルの行数がほとんどの場合パフォーマンスにあまり影響しないように最適化されています。 – dan

答えて

3

理想的には、サーバー側でこの問題を処理することをお勧めします。したがって、ユーザーデータのエンドポイントを呼び出すと、並べ替えが処理され、100個までのアイテムしか返されません。

これを実行したくない場合は、2つのオプションの中から選択するだけで、ソート後に要素を削除する必要がない場合は、100後に要素を削除することをお勧めします。これにより、各オブジェクトのサイズに応じて多少のメモリが解放されます。簡単に100の後に項目を削除するには、これを使用することができます:

一般
myArray.removeRange(100..<myArray.count) 
+1

ええ、今はこれが私にとって最高のフィットです。私は後でそれをサーバー側で修正しますが、あなたのコードはまさに私が今必要だったものです。ランダムに感謝 –

1

あなたがテーブルビューまたはエントリの任意の数の高価なデータストアのいくつかの種類によって支えられてコレクションビューを持っている時はいつでも、話すそのかどうかのデータベースまたはREST呼び出し、その他何でもロードをページ設定し、ユーザーがスクロールしたときにさらにレコードを取得したい場合。たとえば、Facebookのフィードに行くときに、Facebookの投稿をすべて読み込むことは望ましくありません。最新のフィード項目のみが読み込まれ、ビューコントローラがスクロールするときにサーバーにさらにデータが要求されるため、無期限にスクロールできます。

func refresh() { 
     if isLoading == false { 
      isEndOfData = false 
      currentPage = 0 
      loadPage(currentPage) 
     } 
    } 

    func loadPage(_ page: Int) { 
     isLoading = true 
     Notification.getPage(currentPage, pageSize: pageSize) { error, notifications in 
     //Handle API call here 
     } 
    } 

    func loadNextPage() { 
     if isLoading == false && isEndOfData == false { 
      currentPage += 1 
      loadPage(currentPage) 
     } 
    } 

    //MARK: UIScrollViewDelegate 
    extension NotificationViewController: UIScrollViewDelegate { 
     func scrollViewDidScroll(_ scrollView: UIScrollView) { 
      let currentOffset = scrollView.contentOffset.y 
      let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height 
      if (maximumOffset - currentOffset) <= GlobalConstants.paginationScrollOffset { 
       loadNextPage() 
      } 
     } 
    } 
関連する問題