2013-09-02 2 views
0

나는 plist 파일에 데이터를 저장하는 간단한 응용 프로그램을 가지고 있으며이 데이터로 작업해야합니다. 그래서 데이터를 저장하는 과정은 약 5 초 (제안 공부를위한 인공 지연)와 동시에 (예를 들어 두 번째 화면에 표시하기 위해) plist의 데이터를 읽어야합니다.안전하게 GCD를 사용하여 plist 파일 작업하는 방법?

은 모든 그래서 일단 내가

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{}); 

의 저장 방법 및

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{}); 

의 읽기 방법을 이동하지만 난 동안 PLIST를 읽으려고 할 때 나는 문제를 일으킬 수 있다고 생각 절약 프로세스.

어쨌든 화면을 고정 할 필요가 없습니다. 어떻게 여러 스레드에서 plist에 대한 I/O 프로세스를 올바르게 작성합니까? 읽기/쓰기를 위해 두 개의 다른 대기열을 사용해야합니까? 동기화하는 방법?

답변

3

팁 : 리더 라이터 액세스와 성능 향상

사용 동시 서브 큐 •

  • DISPATCH_QUEUE_CONCURRENT

사용 동시 동기

  • dispatch_sync "을 읽고"• ()
  • 당신은, 초기화에 펜촉 깨어 당신의 큐를 만들 수

    // ... 
        _someManagerQueue = dispatch_queue_create("SomeManager", DISPATCH_QUEUE_CONCURRENT); 
    // ... 
    

    등 :

• 사용 비동기 직렬화는

  • dispatch_barrier_async()

예 "기록" .. 동일한 인스턴스에서 함수가 두 번 이상 호출 될 수 있으면 dispatch_once를 사용하십시오.

다음

:

- (id) getSomeArrayItem:(NSUInteger) index { 
    id importantObj = NULL; 
    dispatch_sync(_someManagerQueue,^{ 
     id importantObj = [_importantArray objectAtIndex:index]; 
    }); 
    return importantObj; 
} 
- (void) removeSomeArrayItem:(id) object { 
    dispatch_barrier_async(_someManagerQueue,^{ 
     [_importantArray removeObject:object]; 
    }); 
} 
- (void) addSomeArrayItem:(id) object { 
    dispatch_barrier_async(_someManagerQueue,^{ 
     [_importantArray addObject:object]; 
    }); 
} 

당신이 (예를 들어 배열) 정보를 읽을 때마다 모든 "변화"가 만들어 지거나 있습니다되었는지 확인 그런 식으로 을 "대기". 그리고 정보를 쓸 때마다 프로그램은 작업이 완료 될 때까지 기다리지 못하도록 차단되지 않습니다.

직렬 대기열을 사용할 수는 있지만 처리량이 많고 시간이 판독 값을 병렬 처리하지 않습니다. 그렇게하면 여러 스레드를 사용하는 경우 "쓰기"가 아니면 다른 스레드를 대기시켜야합니다. 대한

더 많은 정보 : WWDC 2012 세션 (712)

OK
1

읽기 및 쓰기 모두에 대해 단일 직렬 대기열을 사용해야합니다. 그렇게하면 서로 간섭하지 않을 것입니다. 당신이 당신의 큐 만들 수 viewDidLoad 예를 들어

:

self.queue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

를 그리고 저장할 때 당신은 그것을 사용할 수 있습니다

dispatch_async(self.queue, ^{ 
    // save 
}); 

을하고 읽을 때 :

dispatch_async(self.queue, ^{ 
    // read 
}); 

이를 일부 공유 리소스에 대한 액세스를 동기화하기 위해 직렬 대기열의 주요 목적 중 하나입니다 (discussion of serial queues 참조).

+0

, 나는 시리얼 대기열을 사용하려고합니다 나중에 결과를 쓸 것이다, U 감사합니다! – ShurupuS