我正在撰寫一個額外的選單欄,向您顯示已安裝應用程式的串列,并允許您單擊串列中的每個按鈕以打開該應用程式。顯然,為此,我需要一個用戶擁有的每個應用程式的串列。我選擇執行此操作的具體方法是制作一個函式,該函式將回圈遍歷系統應用程式檔案夾中的檔案,洗掉應用程式內容中的任何內容或未以 .app 結尾的內容,并回傳包含檔案串列的陣列作為名稱,然后迭代以創建用戶可以單擊以啟動應用程式的“應用程式按鈕”串列。
我的功能代碼是
func enumerateAppsFolder() -> Array<String> {
var fileNames:Array<String> = []
let fileManager = FileManager.default
let enumerator:FileManager.DirectoryEnumerator = fileManager.enumerator(atPath:"/Applications/")!
while let element = enumerator.nextObject() as? String {
if element.hasSuffix("app") && !element.contains("Contents") { // checks the extension
fileNames.append(element)
}
}
return fileNames
}
我用
ForEach(enumerateAppsFolder(), id:\.self){
AppBarMenuItem(itemAppName: $0)
}
但是當我那樣做時,結果是我所期望的,但是性能很糟糕。這可以在螢屏截圖中看到,并且只會因某些人系統上較大的應用程式檔案夾而變得更糟
(當應用程式啟動時,大約需要 5 分鐘,CPU 和磁盤使用率也非常高)有沒有更好的和更快的方法來檢索系統上的每個應用程式,類似于 macOS 啟動板或“打開方式..”串列?
uj5u.com熱心網友回復:
您正在使用的enumerator方法FileManager執行檔案樹的深度列舉。您不需要深度列舉,只需要頂級列舉。使用具有引數并傳入的enumerator方法的版本。options.skipsSubdirectoryDescendants
這是您的函式的更新版本,它URL直接從FileManagerApplications 檔案夾獲取一個,然后進行淺層列舉以獲取應用程式串列。
func enumerateAppsFolder() -> [String] {
var appNames = [String]()
let fileManager = FileManager.default
if let appsURL = fileManager.urls(for: .applicationDirectory, in: .localDomainMask).first {
if let enumerator = fileManager.enumerator(at: appsURL, includingPropertiesForKeys: nil, options: .skipsSubdirectoryDescendants) {
while let element = enumerator.nextObject() as? URL {
if element.pathExtension == "app" { // checks the extension
appNames.append(element.deletingPathExtension().lastPathComponent)
}
}
}
}
return appNames
}
print(enumerateAppsFolder())
從 Swift Playground 運行時的示例輸出:
“Numbers”、“Dropbox”、“Xcode”、“Apple Configurator 2”、“iMovie”
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/536720.html
標籤:迅速苹果系统迅捷文件管理
