【问题标题】:Using Realm with MPMediaQuery将 Realm 与 MPMediaQuery 一起使用
【发布时间】:2017-01-19 08:12:35
【问题描述】:

我想构建一个可以设置书签的有声书播放器。使用 MPMediaQuery 从我的图书馆加载有声读物可以正常工作,但是当我通过 iTunes 取出有声读物时,它会保留在我的领域文件中。

我希望realm在通过iTunes更新播放列表时自动删除该条目,但我似乎不知道如何。

这是我的代码。

class Books: Object {

dynamic var artistName: String?
dynamic var albumTitle: String?
dynamic var artwork: NSData?
dynamic var albumUrl: String?

dynamic var persistentID: String?

let parts = List<BookParts>()

override static func primaryKey() -> String? {
    return "persistentID"
}

override class func indexedProperties() -> [String] {
    return ["albumTitle"]
}

convenience init(artistName: String, albumTitle: String, albumUrl: String) {
    self.init()
    self.artistName = artistName
    self.albumTitle = albumTitle
    self.albumUrl = albumUrl
}


class BookQuery {

let realm = try! Realm()
var bookItems = Array<Books>()
var partItems = Array<BookParts>()

func getBooks() {

    let query: MPMediaQuery = MPMediaQuery.audiobooks()
    query.groupingType = .album
    let collection: [MPMediaItemCollection] = query.collections!

    try! realm.write {

        for allbooks in collection {
            let item = allbooks.representativeItem
            let book = Books()

            let id = item?.value(forProperty: MPMediaItemPropertyAlbumPersistentID) as! Int

            book.artistName = item?.artist
            book.albumTitle = item?.albumTitle
            book.albumUrl = item?.assetURL?.absoluteString
            book.artwork = Helper.getArtwork(item?.artwork) as NSData?
            book.persistentID = id.stringValue

            realm.add(book, update: true)

            guard realm.object(ofType: Books.self, forPrimaryKey: "persistentID") != nil else {
                continue
            }
            bookItems.append(book)

            }
        }
    }
}

我在 LibraryViewController 的“viewDidLoad”中调用 MediaQuery。 我对编码很陌生,并且正在尝试解决这个问题一段时间。 感谢您的帮助。

【问题讨论】:

    标签: swift realm mpmediaquery


    【解决方案1】:

    您需要做的高级事情是有一种方法来检测 iTunes 播放列表何时更新,然后从领域中删除已删除项目的相应对象。

    解决这个问题的一般方法是在 for 循环开始时获取领域中当前的所有“持久 ID”,将它们放入一个数组中,从数组中删除它看到的每个 ID,然后删除带有剩余数组中的持久 ID,因为它们不在集合中。

    【讨论】:

    • 谢谢,会试试的。
    猜你喜欢
    • 1970-01-01
    • 2017-11-12
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多