2016-10-11 3 views
0

Ничего подобного в документации, кажется, что метод должен быть синхронным, он даже возвращает значение успеха. У меня есть 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") 
} 
+0

Можете ли вы отправить полный код? – user3608500

+0

'reloadData()' в цикле повторения очень дорого. Поместите его после цикла повтора. – vadian

+0

ОК, но это не имеет ничего общего с сообщенной проблемой. Проблема в том, что vidFiles содержит файлы, которые я только что удалил, если я не сплю немного – tishu

ответ

0

Вы делаете это на суб нить!

вы будете судить об этом до файла дескрипта. [NSThread isMainThread];