-
210505 - TILTIL/2021 2021. 5. 6. 03:19
FileManager
FileManager
- 다수의 데이터를 저장할 때는 CoreData를 이용한다.
- App sandbox
- App을 설치하면 만들어지고 앱과 관련된 모든 file은 여기에 저장된다.
- 4개의 Bundle, iCloud, System, Data Container가 존재한다.
- Bundel Container
- 읽기 전용
- 실행파일, 리소스가 저장된다.
- iColud Container
- 동기화 데이터
- Data Container
- Documents Directory
- 사용자가 직접 생성한 데이터를 저장
- Library Dir
- 사용자가 직접 생성하지 않았지만 영구적으로 저장할 데이터
- Cache Dir
- cache 데이터가 들어간다.
- 저장공간이 부족하면 알아서 삭제된다.
- 백업에서 제외시켜야한다.
- tmp Dir
- 임시 data
- 백업에서 제외시켜야 한다.
- 중요한 것은사용자가 직접 생성하지 않은 파일은 백업에서 제외시켜야 한다.
URL
- 경로를 나타낼 때는 URL 구조체를 사용한다. class로 사용하고 싶으면 NSURL을 사용하면 된다
- FileURL, NetworkURL이 있고
- FileURL은 (fileURLWirhPath:) 생성자를 주로 사용
- NetworkURL은 (string:) 생성자를 주로 사용
- NSHomeDirectory() 함수는 사용자의 home dir 경로를 리턴해주는데 앱에서는 Datacontainer의 경로를 리턴해준다.
- Dir안에 있는 데이터를 가져 올 때는 FileManager가 제공하는 contentsOfDirectory() 메서드를 사용한다.
- URL의 정보를 가져올 때는 resourceValues(forKeys:) 메서드를 이용해서 원하는 정보를 가져올 수 있다.
- fileName, Size, Directory유무, backup유무 등을알 수 있다.
- checkResourceIsReachable() 메서드는 이 URL에 file이나 dir이 존재하고 접근 가능하면 true를 리턴해주는 메서드이다.
Bundle
- 프로젝트에 파일을 추가하게 되면 Bundle Dir에 저장되고 Bundle class를 통해서 접근할 수 있다.
- Bundle.main으로 bundle container에 접근 후 url(forResource:withExtension:) 메서드를 이용하여 파일의 경로에 접근할 수 있다.
Directory 만들기
- URL을 먼저 만들어야 하는데 URL을 만들 때는
- appedingPathComponent(_:isDirectoty) 메서드를 이용한다.
- 첫 번째파라미터로 전달한 path를 추가해서 새로운 URL을 리턴해준다.
- isDirectory가 true이면 마지막에 /를 추가해준다.
- Dir을 새로 만들 때는 FileManager가 제공하는createDirectory(at:withIntermediateDirectories:attributes:) 메서드를 이용한다.
File 만들기
- URL을 만들 때 appendingPathComponent()와 appendingPathExtension()을 이용하면 / . 을 직접 작성하지 않아도 알아서 만들어준다.
- 기본적인 Data(contentOf:) 생성자로 데이터를 parsing 할 수 있다.
- 그리고 write(to:) 메서드로 해당 url에 data를 저장할 수 있다.
- String은 path를 다루는 속성이나 메서드가 없지만 NSString은 path를 처리하는 속성이 존재한다.
Dir, File 수정하기
- 삭제는 FileManager가 제공하는 removeItem(at:)을 이용하면 dir, file 모두 삭제가 가능하다.
- 이름을 바꾸면 저장된 URL을 이름에 맞게 바꿔주면 좋은데 이때 새로운 URL을 만들고 그 URL로 이동시키면 된다.
- moveItem(at:to:)메서드를 이용하면 쉽게 옮길 수 있다.
Backup에서 제외시키기
- 사용자가 추가하지 않은 파일은 꼭 백업 대상에서 제외시켜야 하므로 매우 중요한 기능이다.
- resourceValue에 isExcludedFromBackupKey의 값을 바꿔야 한다.
- 값을 바꾸고 나서 꼭 setResourceValues(_:) 메서드로 저장시켜야 한다.
- File을 다룰 때는 background thread에서 동작하도록 하는 게 좋다.
- 비동기코드에서는 FileManager를 defalut를 사용하는 거보다 하나 생성해서 하는 게 좋다.
System.NullReferenceException: Object reference not set to an instance of an object.
Pet Table에 다른 정보를 담아 보내는 이후로 발생했다.
원인은 ToList로 List에 담아 PetDto를 생성하는데 여기서 문제가 발생하는 거 같다.
처음 생각해본 해결방법은 query 할 때 다른 table의 정보를 포함하려면 include를 해줬어서 여기에도 적용시켜보려 했지만 include를 사용할 수는 없었다.
두 번째 해결 방법으로 정보가 없다면 ToList를 사용하지 않고 nullable을 전달하는 거였는데 if문으로 count != 0 으로 해봤지만 이건 아닌 듯싶다.
그래서 count가 아닌 == null로 분기했더니 문제를 해결했다.
Client에서 정상적으로 Pet이 생성되지 않았는데 서버에는 계속 저장되는 문제
위 문제를 해결하고 서버를 확인해봤는데 하나만 생성되어야 하는 데이터가 여러 개가 저장돼있었다...ㅠㅠ
문제는 Family을 생성하고 context에 Add한다음 save를 해서 그런건데 여기서 save를 하지 않으면 petDTO를 생성할 때 family 정보를 담을 수 없어서 이건 뺄 수가 없다.
해결방법은 client에서 무조건 Post를 보내는 게 아니라 family 또는 pet이 생성이 돼있다면 put으로 수정하는 방법으로 문제를 해결해봐야겠다.
728x90'TIL > 2021' 카테고리의 다른 글
210509 - TIL (0) 2021.05.10 210507 - TIL (0) 2021.05.08 210502 - TIL (0) 2021.05.03 210430 - TIL (0) 2021.05.01 210429 - TIL (0) 2021.04.30