본문 바로가기
C.W.K.
Stream
Lesson 03 of 05 · published

새로고침은 폴더를 다시 읽어

~11 min · refresh, enumeration, selection

Level 0Finder 에서 헤매는 중
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"네 번째 줄은 파일이 아냐. 지난번에 파일이 그려졌던 자리일 뿐이지."

탭이 진짜로 들고 있는 것

탭을 보면 폴더를 '열어놓은' 것 같지만, 실제로 저장하는 걸 뜯어보면 이래. 폴더 위치, 보기 방식과 정렬과 필터, 앞뒤 이동 기록, 그리고 선택을 되살릴 힌트. 빠진 게 보여? 파일 목록이 없어. 탭은 폴더 내용을 안 갖고 있어. 어느 자리인지, 거기 지금 뭐가 있든 어떻게 그릴지만 갖고 있지.

새로고침은 그냥 다시 읽는 거야

그러니 새로고침할 때 메모리에서 '다시 불러올' 게 없어. Waygate 는 메인 스레드 밖에서 폴더를 다시 읽고, 지금 디스크에 있는 걸로 줄을 새로 그려. 네가 보는 동안 다른 앱이 파일 셋을 만들고 하나를 지웠으면 새로고침이 정확히 그걸 보여줘. 화면은 진짜에서 폴더 읽기 한 번 이상 멀어진 적이 없어. 애초에 진짜를 들고 있는 척을 안 했으니까.

거짓말 없이 선택 되살리기

미묘한 건 여기야. 새로고침 뒤에 Waygate 는 선택을 되살리려 하는데, 신분증이 맞을 때만 그래. 골라뒀던 파일이 그대로 있으면 계속 선택돼 있어. 사라졌으면 그 자리에 밀려 올라온 파일을 고르는 대신 선택을 조용히 놔줘. 몇 번째 줄인지도, 화면에 뜬 이름도 신분증이 아니니까. 새로고침 뒤에 '네 번째 줄' 을 고른다는 건 생판 남을 고르는 거야.

새로고침은 폴더를 다시 읽고, 선택은 신분이 맞을 때만 되살아나. 탭은 위치와 힌트를 들고 있지 폴더 내용을 안 들고 있어. 줄 번호와 이름은 보여주기용이지 신분이 아니야. 그래서 새로고침 뒤에 자리만 물려받은 파일한테 작업이 떨어지는 일이 없어.
실시간 갱신도 결국 싼 새로고침이야. Waygate 가 폴더 변화를 감시해서 자동으로 다시 읽을 수는 있는데, 방식은 똑같이 정직한 다시 읽기야. 캐시된 줄을 그 자리에서 손보는 게 아니고. 유령 줄은 늘 '캐시를 손보다가' 생기지, '폴더를 다시 읽다가' 는 안 생겨.

Code

탭은 자리만 가리켜, 내용은 안 담아·swift
struct Tab {
    var location: LocationReference     // WHERE, not WHAT
    var viewMode: ViewMode
    var sort: SortDescriptor
    var filter: String?
    var history: NavigationHistory
    var selectionHints: [ResourceID]    // identities to re-select if still present
    // NOTE: there is no `var files: [File]` here. On purpose.
}

func refresh(_ tab: inout Tab) async throws {
    let rows = try await enumerate(tab.location)          // fresh read, off-main
    let alive = Set(rows.map(\.resourceID))
    // keep only selections whose IDENTITY survived the re-read:
    tab.selectionHints = tab.selectionHints.filter(alive.contains)
    present(rows, reselecting: tab.selectionHints)
}

External links

Exercise

새로고침 뒤에 신분 대신 줄 번호로 선택을 되살리는 파일 관리자를 상상해봐. 사고를 따라가보자. 네 번째 줄을 골랐고, 백그라운드에서 그 위 파일이 지워졌고, 새로고침을 눌렀고, Delete 를 눌렀어. 방금 뭘 지운 거야? 그리고 이걸 막는 규칙을 한 줄로 말해봐.
Hint
위 파일이 사라지면 전부 한 칸씩 올라와. 다섯 번째였던 파일이 네 번째가 되지. 줄 번호로 되살리면 그 파일이 다시 선택되고, Delete 가 거기 떨어져. 신분으로 되살렸으면 원래 파일이 없어진 걸 알고 아무것도 안 골랐을 거야. 자리가 아니라 신분.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.