ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 210505 - TIL
    TIL/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
Designed by Tistory.