我正在研究使用AppleScript(通过AppleScriptObjC)的Swift 4 macOS应用程序,以显示当前正在播放的iTunes曲目的曲目详细信息,包括嵌入的专辑封面。
当嵌入式专辑封面的文件格式为JPG时,即使我快速浏览iTunes资料库中的曲目,我的应用也能完美运行。但是,我的音频文件的很大一部分都有艺术作品的PNG文件。当图像是PNG时,应用程序有时会毫无问题地显示图稿,但是当CPU和内存使用量急剧上升时,它常常会挂起。
编辑:PNG文件的问题似乎是iTunes专辑图片图像的一个问题,这些图片不是完全正方形(恰好是PNG而不是更典型的JPG)。
导致挂起的行是通过Interface Builder链接显示/更改我的图像按钮(类NSButton)中的图像(类NSImage)的行,但我无法弄清楚为什么JPG在PNG时工作正常经常不这样做。
MainViewController.swift的部分
class MainViewController: NSViewController {
@IBOutlet weak var trackTitle: NSTextField!
@IBOutlet weak var trackArtistAlbum: NSTextField!
@IBOutlet weak var trackArtButton: NSButton!
// get current iTunes track info and embedded artwork from array passed from AppleScript function through AppleScriptObjC
func getCurrentTrackInfo() -> (currentTitle: String, currentArtist: String, currentAlbum: String, currentArtwork: NSImage) {
let appleScriptFunction = AppleScript.getCurrentTrackInfoAS() as! AppleScriptProtocol
let infoArray = appleScriptFunction.getCurrentTrackInfoAS()
let currentTitle = infoArray[0] as! String
let currentArtist = infoArray[1] as! String
let currentAlbum = infoArray[2] as! String
let currentArtworkNSData = (infoArray[3] as! NSAppleEventDescriptor).data as NSData
let currentArtwork: NSImage
if NSImage(data: currentArtworkNSData as Data) != nil {
currentArtwork = NSImage(data: currentArtworkNSData as Data)!
} else {
currentArtwork = #imageLiteral(resourceName: "no_artwork_trans")
}
return (currentTitle, currentArtist, currentAlbum, currentArtwork)
}
func setCurrentTrackInfo() {
let albumInfo = getCurrentTrackInfo()
let currentArtistAlbum = albumInfo.currentArtist + " — " + albumInfo.currentAlbum
trackTitle.stringValue = albumInfo.currentTitle
trackArtistAlbum.stringValue = currentArtistAlbum
trackArtButton.image = albumInfo.currentArtwork // loading non-square image into button image at this point causes hang
}
override func viewDidLoad() {
super.viewDidLoad()
setCurrentTrackInfo()
DistributedNotificationCenter.default.addObserver(self,
selector: #selector(iTunesPlayerInfoDidChange(_:)),
name: Notification.Name("com.apple.iTunes.playerInfo"),
object: nil)
}
@objc func iTunesPlayerInfoDidChange(_: Notification) {
setCurrentTrackInfo()
}
}
AppleScriptFunctions.applescript的部分
on getCurrentTrackInfoAS()
tell application "iTunes"
try
set currentTitle to name of current track
set currentArtist to artist of current track
set currentAlbum to album of current track
if count of artwork of current track > 0 then
set currentArtwork to raw data of front artwork of current track
else
set currentArtwork to null
end if
set currentTrackInfo to {currentTitle, currentArtist, currentAlbum, currentArtwork} # indexed array, i.e. [0], [1], [2], [3]
return currentTrackInfo
end try
end tell
end getCurrentTrackInfoAS
答案 0 :(得分:0)
在调查了通过AppleScriptObjC桥接到Swift的PNG图像的红色鲱鱼之后,一些有用的评论让我更好地理解了实际问题和一个相当简单的解决方案,发布在这里以防其他人遇到类似的事情。
修复方法是将按钮图像缩放设置从Proportionally Up or Down
更改为Axes Independent
。按钮视图又被约束到超视图的3个边以及1 to 1 Ratio
约束(使用户可调整大小的按钮图像保持完全正方形)。显然,比率约束与原始缩放设置不能很好地匹配(尽管Interface Builder中没有报告冲突)。
与图像缩放有关的Apple文档:NSImageScaling
如果有人更好地理解为什么缩放设置可能导致处理器/内存使用失控,我欢迎更多评论或改进我的回答(或问题)。