アプリケーションで iCloud Drive への保存を実装しています。現在、シミュレーターでアプリをテストしています。ファイルを iCloud ドライブに保存すると、期待どおりにドライブに表示されます。私のコードでは、NotificationCenter.default.addObserver を実装しました。startQuery() は、アプリケーションがアクティブになると呼び出されます。コードサンプルは次のとおりです。
@objc func startQuery()
{
stopQuery()
query = documentQuery()
print( "adding notifications" )
NotificationCenter.default.addObserver(self, selector: #selector(finishGatheringNotification(notifciations:)), name: NSNotification.Name.NSMetadataQueryDidFinishGathering, object:nil )
NotificationCenter.default.addObserver(self, selector: #selector(didUpdateNotification(notifciations:)), name: NSNotification.Name.NSMetadataQueryDidUpdate, object:nil )
query?.start()
}
@objc func stopQuery()
{
guard let query = self.query else{
return
}
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.NSMetadataQueryDidFinishGathering, object:nil )
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.NSMetadataQueryDidUpdate, object:nil )
query.stop()
self.query = nil
}
@objc func finishGatheringNotification( notifciations:NSNotification ){
print( "called finished gathering notification" )
processICloudFiles(notifciations: notifciations )
}
@objc func didUpdateNotification( notifciations:NSNotification ){
// This seems to be getting called non-stop
print( "called updated notification" )
processICloudFiles(notifciations: notifciations )
}
@objc func processICloudFiles( notifciations:NSNotification )
{
guard let query = query else{
return
}
query.disableUpdates()
var metaDataItems:[NSMetadataItem] = []
if let queryResults = query.results as? [NSMetadataItem]{
print( "query results:\(queryResults.count)")
for result in queryResults{
if let fileURL = result.value(forAttribute: NSMetadataItemURLKey ) as? NSURL{
print( "file found in iCloud:\(String(describing: fileURL.lastPathComponent))")
metaDataItems.append( result )
}
}
if metaDataItems.count > 0{
updateICloudFiles(metaDataItems: metaDataItems)
}
}
query.enableUpdates()
}
ただし、NSMetadataQueryDidUpdate のセレクターは no stop と呼ばれています。iCloud ディスクの内容が変更された場合にのみ呼び出されるように意図されていると思いました。
助言がありますか。
ありがとう
レザ