元数据查询在停止查询之前解除分配
metadataquery deallocation before stopquery
我正在使用 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。为避免竞争条件,您应该首先调用 -stopQuery
在调用 -startQuery 的 运行 循环上
如有任何指导,我们将不胜感激。
我相信我正在递归调用元数据查询。我重写了 tableview 控制器的 viewDidLoad 和 viewWillAppear 方法,现在我相信上面的代码工作正常。
我正在使用 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。为避免竞争条件,您应该首先调用 -stopQuery 在调用 -startQuery 的 运行 循环上
如有任何指导,我们将不胜感激。
我相信我正在递归调用元数据查询。我重写了 tableview 控制器的 viewDidLoad 和 viewWillAppear 方法,现在我相信上面的代码工作正常。