2017-01-11 1 views
0

В моем приложении пользователь может записывать аудио (например, Голосовые заметки). По завершении записи пользователь получает ввод от пользователя, чтобы записать название, а аудио - в UITableView. Записанные аудио сортируются по их имени (по алфавиту). Мне нужно отсортировать их по дате создания - последний созданный звук появится первым. Я использовал два массива -Swift - Сортировать ячейки таблицы по дате создания

1.recordedAudioFilesURLArray (Тип: URL) & 2.recordedAudioFileName (Тип: String).

Записанные аудиозаписи сохраняются в каталоге документов. Вот мой пример кода ...

func getRecordedAudioFilesFromDocDirectory() { 
    let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! 
    do { 
     let directoryContents = try FileManager.default.contentsOfDirectory(at: documentsUrl, includingPropertiesForKeys: nil, options: []) 
     recordedAudioFilesURLArray = directoryContents.filter{ $0.pathExtension == "m4a" } 
    } catch let error as NSError { 
     print(error.localizedDescription) 
    } 
    recordedAudioFileNames = recordedAudioFilesURLArray.flatMap({$0.deletingPathExtension().lastPathComponent}) 
} 

func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return recordedAudioFilesURLArray.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = UITableViewCell() 
    cell.textLabel?.text = recordedAudioFileNames[indexPath.row] as! NSString as String 
    return cell 
} 
+0

Есть ли у вас дат аудиофайлы в массиве? если да, то разделите массив дат выборки. –

+0

нет ... брат. У меня нет –

+2

. Как вы готовы сортировать по датам, если у вас их нет? –

ответ

0

Этот stackoverflow answer показывает, как мы можем получить файл дату создания с помощью NSFileManager API.

Используя приведенный выше ответ, я попробовал образец.

//This array will hold info like filename and creation date. You can choose to create model class for this 
    var fileArray = [[String:NSObject]]() 

    //traverse each file in the array 
    for path in recordedAudioFilesURLArray! 
    { 
     //get metadata (attibutes) for each file 
     let dictionary = try? NSFileManager.defaultManager().attributesOfItemAtPath(path.path!) 

     //save creationDate for each file, we will need this to sort it 
     let fileDictionary = ["fileName":path.lastPathComponent!, NSFileCreationDate:dictionary?[NSFileCreationDate] as! NSDate] 
     fileArray.append(fileDictionary) 
    } 

    //sorting goes here 
    fileArray.sortInPlace { (obj1, obj2) -> Bool in 

     let date1 = obj1[NSFileCreationDate] as! NSDate 
     let date2 = obj2[NSFileCreationDate] as! NSDate 

     return (date2.compare(date1) == .OrderedDescending) 
    } 

    //Let's check the result 
    for dictionary in fileArray 
    { 
     NSLog("\(dictionary["fileName"])") 
    } 

Это работает для меня. Надеюсь, это поможет.

Примечание: Это всего лишь образец, который я пробовал. Возможно, вам понадобится какая-то модификация для работы .

0

Try следующий код функ getRecordedAudioFilesFromDocDirectory() { вар temprecordedAudioFilesArray: [NSDictionary] = []

let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! 
    do { 
     let directoryContents = try FileManager.default.contentsOfDirectory(at: documentsUrl, includingPropertiesForKeys: nil, options: []) 
     recordedAudioFilesURLArray = directoryContents.filter{ $0.pathExtension == "mp3" } 

    } catch let error as NSError { 
     print(error.localizedDescription) 
    } 
    for item in recordedAudioFilesURLArray { 
     var fileName: String? 
     var creationDate : Date? 
     let path: String = item.path 
     do{ 
      let attr = try FileManager.default.attributesOfItem(atPath: path) 
      creationDate = attr[FileAttributeKey.creationDate] as? Date 
      fileName = item.lastPathComponent 

      let fileInfo = ["filepath": item, "name": fileName!, "createnDate": creationDate!] 
      temprecordedAudioFilesArray.append(fileInfo as NSDictionary) 


     } 
     catch { 

     } 

    } 
    temprecordedAudioFilesArray.sort(by: { (($0 as! Dictionary<String, AnyObject>)["createnDate"] as? NSDate)?.compare(($1 as! Dictionary<String, AnyObject>)["createnDate"] as? NSDate as! Date) == .orderedAscending}) 

    for file in temprecordedAudioFilesArray{ 
     recordedAudioFileNames.append((file["name"] as? String)!) 
     print(file["name"]) 
    } 

} 
+0

Элементы в ** temprecordedAudioFilesArray ** отсортированы отлично. Но в соответствии с этим мне нужно отсортировать ** registeredAudioFilesURLArray **, потому что этот массив содержит URL записанных звуков, которые нужны для их воспроизведения. Как это сделать? Вы можете помочь ? –

+0

объявляет внешнюю функцию 'temprecordedAudioFilesArray' (где u объявлена ​​зарегистрированнаяAudioFilesURLArray) и добавляет еще один ключ в словарь информации о файлах' let fileInfo = ["filepath": item, "name": fileName !, createnDate ": createDate!] As [String : Any] ', и когда вы хотите играть, обратитесь к' temprecordedAudioFilesArray' вместо 'recordAudioFilesURLArray' Надеемся, что это поможет –

+0

также сделать' записаннымAudioFilesURLArray' в качестве локальной переменной и вместо него использовать 'temprecordedAudioFilesArray'. вам нужны изменения кода для этого, поскольку «temprecordedAudioFilesArray» - это массив 'URL', но' temprecordedAudioFilesArray' - массив словаря. –