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

서로 맞춰서 읽고 쓰기

~12 min · nsfilecoordinator, coordinated-access, concurrency

Level 0Finder 에서 헤매는 중
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"네 앱만 파일을 만지는 게 아니야. Finder 도 Dropbox 도 iCloud 도 Spotlight 도 같은 방에 있어. 맞추든가 부딪히든가야."

파일은 모두가 같이 써

파일 코드를 짜다 보면 내 앱만 디스크를 만지는 것처럼 쓰게 돼. 절대 아니야. Waygate 가 폴더를 읽는 동안 Finder 가 그 안 파일 이름을 바꾸고 있을 수도, 동기화 클라이언트가 내려받은 걸 쓰고 있을 수도, Spotlight 이 색인을 만들고 있을 수도, 클라우드가 파일을 내려받고 있을 수도 있어. 그걸 전혀 의식 안 하고 읽으면 쓰다 만 파일을 잡거나 동기화와 부딪혀 엉뚱한 그림을 보게 돼.

NSFileCoordinator 가 그 악수야

macOS 는 서로 맞추는 방법을 줘. NSFileCoordinator. 읽거나 쓸 거라고 시스템에 알리면, 같이 맞추기로 한 다른 참여자들 — file provider 나 다른 앱 — 이 잠깐 멈추거나 쓰던 걸 마무리하거나 비켜줘. 클라우드가 건드릴 수도 있는 파일을 제대로 읽어야 할 때 Waygate 는 이걸 써. 그래야 반쯤 적용된 상태가 아니라 정리된 상태를 보거든. 속도가 아니라 여럿이 같이 쓸 때의 정확함 얘기야.

반대로 알림도 받아

맞추는 건 양방향이야. NSFilePresenter 를 쓰면 지금 보여주고 있는 게 곧 바뀔 거라는 알림도 받을 수 있어. 그럼 폴더를 다시 읽거나, 한 줄을 갱신하거나, 연결 끊김으로 바꾸면 되지. 맞춘다는 건 Waygate 자기 읽기만 지키는 게 아니라, 같이 쓰는 파일시스템에 정직하게 참여해서 화면이 남들이 바꾸는 진짜와 발맞춰 가게 하는 일이야.

밖에서 상태가 바뀔 수 있는 곳에선 서로 맞춰서 읽고 써. 파일은 Finder 와 동기화 클라이언트, Spotlight, file provider 와 함께 쓰는 물건이고, NSFileCoordinator 가 그들을 의식하며 움직이게 해줘서 쓰다 만 걸 읽거나 부딪히는 일을 줄여줘. 속도가 아니라 정확함에 관한 장치야.
맞춘다고 세상이 멈추는 건 아니야. 다른 앱을 얼리지도 않고 영원한 독점을 보장하지도 않아. 참여하기로 한 쪽들끼리의 약속일 뿐이지. 무시하는 프로세스는 여전히 파일을 바꿔. 그래서 Waygate 는 손대기 직전에 확인해(Track 2). 맞추기가 부딪힘을 줄이고, 다시 확인하기가 빠져나간 걸 잡아.

Code

맞춰서 읽기: 쓰다 만 게 아니라 정리된 상태·swift
func coordinatedRead(_ url: URL) throws -> Data {
    let coordinator = NSFileCoordinator(filePresenter: nil)
    var coordError: NSError?
    var result: Data?
    // Announce intent to read; other coordinated actors flush/yield first.
    coordinator.coordinate(readingItemAt: url, options: [], error: &coordError) { safeURL in
        result = try? Data(contentsOf: safeURL)   // reads a SETTLED state
    }
    if let coordError { throw coordError }
    guard let result else { throw OpError.coordinatedReadFailed }
    return result
}
// Without coordination, a sync client mid-write could hand you half a file
// -- valid bytes, wrong content, no error. Coordination avoids the torn read.

External links

Exercise

쓰다 만 걸 읽는 상황을 구체적으로 그려봐. 텍스트 편집기가 10 MB 문서를 저장하는 동안 네 앱이 맞추지 않고 그 파일을 읽어. 뭘 받을 수 있고, 뭐가 잘못됐는지 알기라도 할까? 그다음 왜 '맞추기' 와 '손대기 직전 확인' 이 겹치는 게 아니라 서로 다른 걸 막는지 설명해봐.
Hint
안 맞추면 편집기가 파일을 비운 뒤 새 내용을 쓰기 전에 읽을 수도 있어. 오류 하나 없이 빈 파일이나 반쪽을 받는 거지. 맞추기는 그 어정쩡한 순간을 안 잡게 해주고, 손대기 직전 확인은 행동하는 시점에 신분과 상태가 달라졌는지를 잡아. 하나는 읽는 동안, 하나는 바꾸기 직전. 막는 게 달라서 둘 다 필요해.

Progress

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

댓글 0

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

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