これは私が何か間違っているかもしれないので、これはquestionのフォローアップです。レルム - リストからオブジェクトを削除して追加する
私のアプリにはビデオプレーヤーがあります。コレクションビューには、FavoritesVC
というビデオのリストがあります。いずれかのセルをタップすると、PlayerVC
という新しいビューコントローラが選択されたビデオを再生するように見えます。また、リスト全体が渡されるため、この新しいビューコントローラPlayerVC
のコレクションビューからすべてのビデオを順番に見ることができます。
すべてここでうまくいきます。
問題は、私がお気に入りにしたい/ビデオを好まない場合です。私が上に投稿した質問から、私は答えからこれを使用することに決めました:
isDeletedプロパティをVideoクラスに追加します。ユーザー がビデオを好まない場合は、ビデオオブジェクトを FavoriteList.videosから削除し、そのプロパティをtrueに設定しますが、Realmに残します。 後で(アプリケーションが終了するか、ビューコントローラが が終了したとき)、 isDeletedがtrueであるすべてのオブジェクトに対して一般的なクエリを実行して削除できます(これによりヘッドレス の問題は解決します)。
セルをタップしたとき、私はこれだけFavoritesVC
であれば仕事を得ることができ、私はスウィフトarray
に領域List
を変換し、PlayerVC
に電力を供給するために、このarray
を使用しています。私がこれをしないで、List
からオブジェクトを取り除いて、List
を循環しようとすると、私はIndex out of range error...
になる。
私はスウィフトarray
にList
を変換し、PlayerVC
作品にそれを渡すために持っていますが、レルムを使用した場合、間違ったようだソリューション。ベストプラクティスは、この変換を行うことはありませんすることですが、この場合には、私は単にこれは、リストのために私のコードですList
を使用する方法がわからない:
/// Model class that manages the ordering of `Video` objects.
final class FavoriteList: Object {
// MARK: - Properties
/// `objectId` is set to a static value so that only
/// one `FavoriteList` object could be saved into Realm.
dynamic var objectId = 0
let videos = List<Video>()
// MARK: - Realm Meta Information
override class func primaryKey() -> String? {
return "objectId"
}
}
私は配列にリストを変換しますそしてそのようPlayerVCを作成します。
class FavoritesViewController: UIViewController {
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if let playerVC = self.storyboard?.instantiateViewController(withIdentifier: "playerVC") as? PlayerViewController {
// I convert the `List` to a Swift `array` here.
playerVC.videos = Array(favoritesManager.favoriteList.videos)
playerVC.currentVideoIndex = indexPath.row
self.parent?.present(playerVC, animated: true, completion: nil)
}
}
}
これはPlayerVC
の抜粋です。 FavoritesVC
のセルがタップされたときにこれが作成されます:最後に
class PlayerViewControllerr: UIViewController {
// Array passed from `FavoritesVC`. I converted this from the `List`.
var videos = [Video]()
var currentVideoIndex: Int!
var currentVideo: Video {
return videos[currentVideoIndex]
}
// HELP
// Example of how to cycle through videos. This cause crash if I use the `List` instead of Swift `array`.
func playNextVideo() {
if (currentVideoIndex + 1) >= videos.count {
currentVideoIndex = 0
} else {
currentVideoIndex = currentVideoIndex + 1
}
videoPlaybackManager.video = currentVideo
}
// This is where I add and remove videos from the `List`
@IBAction func didToggleFavoriteButton(_ sender: UIButton) {
favoritesManager.handleFavoriting(currentVideo, from: location) { [weak self] error in
if let error = error {
self?.present(UIAlertController.handleErrorWithMessage(error.localizedDescription, error: error), animated: true, completion: nil)
}
}
}
}
、List
からオブジェクトを追加および削除するためのコード:
class FavoritesManager {
let favoriteList: FavoriteList
init(favoriteList: FavoriteList) {
self.favoriteList = favoriteList
}
/// Adds or removes a `Video` from the `FavoriteList`.
private func handleAddingAndRemovingVideoFromFavoriteList(_ video: Video) {
if isFavorite(video) {
removeVideoFromFavoriteList(video)
} else {
addVideoToFavoriteList(video)
}
}
/// Adds a `Video` to the `FavoriteList`.
///
/// Modifies `Video` `isDeleted` property to false so no garbage collection is needed.
private func addVideoToFavoriteList(_ video: Video) {
let realm = try! Realm()
try! realm.write {
favoriteList.videos.append(video)
video.isDeleted = false
}
}
/// Removes a `Video` from the `FavoriteList`.
///
/// Modifies `Video` `isDeleted` property to true so garbage collection is needed.
/// Does not delete the `Video` from Realm or delete it's files.
private func removeVideoFromFavoriteList(_ video: Video) {
let predicate = NSPredicate(format: "objectId = %@", video.objectId)
guard let index = favoriteList.videos.index(matching: predicate) else { return }
let realm = try! Realm()
try! realm.write {
favoriteList.videos.remove(objectAtIndex: index)
video.isDeleted = true
}
}
}
任意の考え?
お返事ありがとうございます。これはクラッシュを修正します!しかし、私が間違っていない限り、経験はSwift配列と同じではありません。今起こっていること: 'PlayerVC'に2つのビデオがあるとしましょう。あなたが好きでない方は、 'favoriteList' - >から削除されますが、' PlayVideo'を実行した後は 'ListV'にはないので、これを' PlayerVC'に戻すことはできません。 Swiftの配列を使ったユーザーエクスペリエンスは次のようなものです:ビデオが不快であっても、 'PlayerVC'中に' favoriteList'にいなくても、サイクルを繰り返して見ることができます – JEL
申し訳ありませんが、質問。しかし、最終的にSwiftの 'array'が良い選択肢ならば、それが良いのであればそれを使うこともできますか? – JEL
心配はいりません!うん、それは目的にあった。私が上に書いたように、いったんそれが不快だったら、私はユーザーがいったん離れてしまえば、それは完全にそれ自身を取り除くだろうと考えました。あと、動画を退会するまで動画が動画プレーヤーの再生リストに残りたいと思っていましたか?はい。ええ、 'videos'オブジェクトの静的なコピーを作成すると、それがうまくいきます。 – TiM