본문 바로가기

개발/Swift

[Swift] File System

반응형

File System

iOS는 유닉스인 것을 기억하자!
유닉스 파일 시스템에서 접근 가능한 유일한 부분은 샌드박스다.
+ 샌드박스는 닫혀있는 작은 공간을 말한다. 다른 앱의 정보를 적을 수 없음.

iOS가 앱 공간에 제한을 두는 이유는 이렇다.

  • Security-  다른 앱이 앱을 망가뜨리는 것을 원하지 않는다.
  • Privacy - 사용자 정보를 수집하는 경우 다른 악성 앱들이 정보를 빼가는 것을 막는다.
  • Clean up - 사용자가 앱을 사용하지 않으면 정보를 정리할 수 있고, 샌드박스 안에 있다면 샌드박스를 지울 수 있다.

파일 시스템의 접근은 두 개의 클래스 또는 두 개의 객체로 이루어진다는 것이다.
하나는 FileManager이고 다른 하나는 URL이다. (URL은 기본적으로 경로다.)

먼저 해야할 것은 샌드박스 디렉토리 하나를 찾는 것이다.
쓸 수는 없지만 디렉토리로부터 읽을 수는 있다.

샌드박스 URL을 만드는 두 가지 방법이 있다.
FileManager 방법은 UserDefault와 비슷하다. 

let url: URL = FileManager.default.url(
    for directory: FileManager.SearchPathDirectory.documentDirectory, // 샌드박스 디렉토리
    in domainMask: .userDomainMask // iOS에서는 샌드박스가 있기 때문에 항상 .userDomainMask
    appropriateFor: nil, // 항상 nil. 중요하지 않음.
    //파일을 덮었을 때 덮어쓰고자 하는 것의 url을 명시하고자 하고 같은 용량을 차지하는지 확인하기 위함. 
    create: true // 앱이 만들어졌을 때 모든 샌드박스가 존재하지는 않기에 생성해준다.
)

파일을 쓰는 방법은 URL방법인 appendingPathComponent를 사용하면 된다.

func appendingPathComponent(String) -> URL
func appendingPathExtension(String) -> URL

URL이 있으면 파일 url인지 HTTP URL인지 구분할 수 있다.
키를 위한 resourceValues는 여러 개의 키를 사용한다.
그리고 파일 시스템을 확인해 키와 찾은 값들을 갖는 딕셔너리를 반환한다.

var isFileURL: Bool
func resourceValues(for keys: [URLResourceKey]) throws -> [URLResourceKey: Any]?

 

FileManager의 스레드는 오직 하나의 FileManager 인스턴스에서만 안전하다.
FileManager가 메인 스레드가 아닌 다른 스레드에 있다면, 해당하는 다른 스레드에 만들어졌을 때만 안전하다.

FileManager.default는 메인 스레드에서 공유되고 있기에 메인스레드에서만 사용한다.
만약 FileManager에 delegate를 설정하려고 한다면, FileManager.default의 delegate가 아닌
새로 생성된 FileManager의 것을 사용해야한다.

반응형

'개발 > Swift' 카테고리의 다른 글

[Swift] Core Data 알아보기 (2)  (0) 2021.03.02
[Swift] Core Data 알아보기 (1)  (0) 2021.03.01
[Swift] 객체 저장 - Archiving  (0) 2021.02.28
[Swift] 객체 저장 - UserDefaults  (0) 2021.02.28
[Swift] Multithreading  (0) 2021.02.26