Ничего подобного в документации, кажется, что метод должен быть синхронным, он даже возвращает значение успеха. У меня есть UITableView с некоторыми ячейками, и пользователь может удалять элементы, связанные с этими ячейками. Это вызывает следующий код:Является ли NSFileManager.removeItemAtPath асинхронным?
if(manager.fileExistsAtPath(vidUrl.path!))
{
do
{
try manager.removeItemAtURL(vidUrl)
}
catch
{
NSLog("failed to delete video at path \(vidUrl)")
}
}
// reload the table data here
Но каждый раз это называется файл по-прежнему существует, когда данные таблицы перезагружается. Я не вижу способа передать блок завершения файловому менеджеру, который будет выполнен после удаления файла. Делегат NSFileManager имеет только методы «should», но не «сделал» метод.
я в конечном итоге добавив эти очень Hacky линии после того, как сточный заявление, в котором работа, но, безусловно, есть лучший способ справиться с этим?
while(manager.fileExistsAtPath(vidUrl.path!))
{
usleep(5000)
}
EDIT Полный код ниже (это вызвано UIAlertAction)
let okAction = UIAlertAction(title: ok, style: UIAlertActionStyle.Destructive, handler:{
(action: UIAlertAction) -> Void in
HUD.show(HUDContentType.LabeledProgress(title: deleteString, subtitle: "Deleting..."))
for item in self.selectedVideos
{
let vidUrl = (item as! VideoItem).filePath
if(manager.fileExistsAtPath(vidUrl.path!))
{
do
{
try manager.removeItemAtURL(vidUrl)
// If I remove this while loop then files still exist in the loadVideos below
while(manager.fileExistsAtPath(vidUrl.path!))
{
usleep(5000)
}
}
catch {NSLog("failed to delete video at path \(vidUrl)")}
}
}
self.loadVideos()
HUD.hide()
})
и loadVideos функционировать
func loadVideos()
{
self.videos.removeAll()
let documentsUrl = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])
do {
let width = self.collectionView!.bounds.width * 0.4
let targetSize = CGSizeMake(width,width)
let directoryContents = try NSFileManager.defaultManager().contentsOfDirectoryAtURL(documentsUrl, includingPropertiesForKeys: nil, options: [])
let vidFiles = directoryContents.filter{ $0.pathExtension == VIDEO_EXTENSION }
let validUrls = NSMutableArray()
for vid in vidFiles
{
let thumbDuration = GalleryThumbLoader.getVideoThumb(vid.absoluteURL, size: targetSize)
let video = VideoItem(filePath: vid.absoluteURL, bitmap: thumbDuration.bitmap, duration: thumbDuration.duration)
videos.append(video)
dispatch_async(dispatch_get_main_queue(),
{
self.collectionView!.reloadData()
})
validUrls.addObject(vid.absoluteURL.path!)
}
} catch let error as NSError {
NSLog(error.localizedDescription)
videos = [VideoItem]()
}
NSLog("finished loading videos")
}
Можете ли вы отправить полный код? – user3608500
'reloadData()' в цикле повторения очень дорого. Поместите его после цикла повтора. – vadian
ОК, но это не имеет ничего общего с сообщенной проблемой. Проблема в том, что vidFiles содержит файлы, которые я только что удалил, если я не сплю немного – tishu