私はSwift(iOS)にJava(Android)で使用していたアルゴリズムを移植しており、Swiftバージョンの速度に関するいくつかの問題を抱えています。アレイに遅すぎるスウィフトが含まれています
深みのあるオブジェクト(コメントツリー)があり、非表示のオブジェクトのリストと照合してデータセットからの返信を非表示にすることができます。以下は、可視化
Top
- Reply 1
- - Reply 2
- - Reply 3
- Reply 4
であり、データセットから、私は、Javaから変換されてきた
Top
- Reply 1
- Reply 4
関連するメソッドを非表示にした後
//Gets the "real" position of the index provided in the "position" variable. The comments array contains all the used data, and the hidden array is an array of strings that represent items in the dataset that should be skipped over.
func getRealPosition(position: Int)-> Int{
let hElements = getHiddenCountUpTo(location: position)
var diff = 0
var i = 0
while i < hElements {
diff += 1
if(comments.count > position + diff && hidden.contains(comments[(position + diff)].getId())){
i -= 1
}
i += 1
}
return position + diff
}
func getHiddenCountUpTo(location: Int) -> Int{
var count = 0
var i = 0
repeat {
if (comments.count > i && hidden.contains(comments[i].getId())) {
count += 1
}
i += 1
} while(i <= location && i < comments.count)
return count
}
これはのUITableViewControllerにして使用されている以下の通りです。コメントをツリーとして表示します。
はJavaでは、使用してarray.containsは、任意の遅れを生じさせないために十分速かったが、それに追加されheightForRowAt
を呼び出すときに、セルを移入する場合、より多くのコメントIDとして増加の遅れにつながるスウィフトバージョンはgetRealPosition機能を何度も呼び出します「隠れた」配列
配列の "contains"検索の速度を向上させる方法はありますか(おそらく別の種類のコレクションを使用します)。私はアプリケーションでプロファイリングを行い、「含む」は最も時間を要した方法でした。
は、私はあなたがソース配列にテーブルビュー内の行のタップからリンクするrealPositionが必要だと思うあなた
は 'NSOrderedSet'を使用してみてください?私はそれが特にSwift-yのアプローチではないことを認識していますが、順序付きセットは最大スピードメンバーシップテストに必要なものです。あるいは、Swift 'OrderedSet'の[このオープンソース実装](https://github.com/Weebly/OrderedSet)を試すこともできます。 –
問題は「含む」ではありません。問題は、私が信じているのは、表示したいデータとそれを使ってやりたいことが、データモデルが間違っていることです。瞬時にデータを手に入れることができない場合は、データモデルが間違っています。 – matt