0

テーブルビューを作成するために、NSMetadataQuery を使用して、iCloud ユビキタス ドキュメント ディレクトリ内のファイルのリストを取得しています。コードは機能しているようですが、最初に stopQuery を呼び出さずにクエリの割り当てが解除されているというエラーが表示されます。このトピックに関する議論が見つからないようです。ここで簡単なものが欠けていますか?

クエリと通知の関数は次のとおりです。

var myMetadataQuery : NSMetadataQuery = NSMetadataQuery()
var cloudBackFiles : [AnyObject] = [AnyObject]()

func metadataForListOfFiles() {

    myMetadataQuery.predicate = NSPredicate(format: "%K like '*.sqlite'", NSMetadataItemFSNameKey)//change to "%K like '*.sqlite'"
    myMetadataQuery.searchScopes = [NSMetadataQueryUbiquitousDocumentsScope]

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "metadataQueryDidFinishGathering:", name: NSMetadataQueryDidFinishGatheringNotification, object: myMetadataQuery)

    myMetadataQuery.startQuery()

}//metadataForListOfFiles

func metadataQueryDidFinishGathering(notification : NSNotification) -> [AnyObject] {

    let query : NSMetadataQuery = notification.object as! NSMetadataQuery
    query.disableUpdates()

    NSNotificationCenter.defaultCenter().removeObserver(self, name: NSMetadataQueryDidFinishGatheringNotification, object: query)

    query.stopQuery()

    let results = query.results

    cloudBackFiles = []

    if (query.resultCount >= 1) {
        println("query.resultCount = \(query.resultCount)")

        for var i = 0; i < query.resultCount; i++ {
            var forResultString = results[i].valueForAttribute(NSMetadataItemFSNameKey) as! String
            println("results[\(i)].value = \(forResultString)")
            var forResultStringNoExt = forResultString.stringByDeletingPathExtension
            cloudBackFiles.append(forResultStringNoExt)
        }//for

    } else {

        println("The query.resultCount was 0!")

    }//if count else
    println("cloudBackFiles list is: ")
    println(cloudBackFiles)

    //justForTest = results

    return results

}//metadataQueryDidFinishGathering(x)

そして、これはエラーです:

2015-04-24 22:49:38.367 [26397:2377464] は、最初に -stopQuery を呼び出さずに割り当て解除されています。競合状態を回避するには、最初に -startQuery が呼び出された実行ループで -stopQuery を呼び出す必要があります。

任意のガイダンスをいただければ幸いです。

4

1 に答える 1

0

メタデータ クエリを再帰的に呼び出していたと思います。tableview コントローラーの viewDidLoad メソッドと viewWillAppear メソッドを書き直したところ、上記のコードが正しく機能していると思います。

于 2015-04-28T18:48:12.323 に答える