【问题标题】:How to create MPMediaItem from assetURL!.absoluteString?如何从assetURL!.absoluteString 创建 MPMediaItem?
【发布时间】:2020-04-21 02:56:44
【问题描述】:

我将(mediaItemCollection.items.first?.assetURL!.absoluteString) 作为字符串保存到本地 SQLite DB。 现在我想从保存的字符串创建 MPMediaItem 对象,即assetURL!.absoluteString,是否可以从它的 assesURL 创建 MPMediaItem 对象?如果不可能,那么我应该将什么保存到 SQLite DB 以便我可以从保存的属性创建 MPMediaItem 对象?

【问题讨论】:

  • 对于本地文件 URL absoluteString 无论如何都是错误的 API。
  • assetURL 包含persistentID,可以通过它查询。但是你绝对应该存储一些其他信息而不是url
  • 嘿@user28434 和@vadian 任何想法应该使用什么来代替absoluteString
  • 在我的项目中,我正在保存有关歌曲本身的信息。像NameArtists 等。但这仅仅是因为在我的项目中,用户可以在他们的设备之间共享有关媒体的信息,而persistentID(和assetURL)在不同的设备上完全不同。我用它来查询MPMediaItem。但在你的情况下,如果对媒体的“引用”永远不会离开设备,你可以存储persistentID
  • 嘿@user28434 你能解释一下如何通过persistentID查询吗?我找不到这样做的方法。

标签: swift mpmediaitem mpmediapickercontroller mpmediaitemcollection


【解决方案1】:

我从@user28434 的建议中找到了解决方案。

我将 persistentID 作为字符串保存到 SQLite DB

 let songItem = mediaItemCollection.representativeItem!
 let persistantID = String(songItem.persistentID)

通过这个persistentID,我可以使用MPMediaQuery 创建MPMediaItem 对象,同时从数据库中获取存储的persistentID

以下方式创建MPMediaItem对象。

 let noCloudPre = MPMediaPropertyPredicate(value: NSNumber(booleanLiteral: false),
                                              forProperty: MPMediaItemPropertyIsCloudItem)

    func getSongItem(persistantID: String) -> MPMediaItem?{
        let songQuery = MPMediaQuery.songs()
        songQuery.addFilterPredicate(noCloudPre)
        songQuery.addFilterPredicate(MPMediaPropertyPredicate(value: persistantID,
                                    forProperty: MPMediaItemPropertyPersistentID,
                                    comparisonType: MPMediaPredicateComparison.equalTo))
        return songQuery.items?[0]
    }

【讨论】:

  • 将其存储为数字会更有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多