2013-10-28 2 views
0

EADemo 예제를 사용하여 블루투스 앱을 개발 중입니다.iOS의 이벤트를 기반으로 여러 작업 시작하기

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode 
{ 
    switch (eventCode) { 
     case 1: 
     //here I want to start two tasks 
     break; 

} 

그리고 어떤 I 작성하고 평행 읽어야하는 나는 일반적인 큐를 가지고 : 블루투스 inputStream에 데이터가있을 때마다, 다음과 같은 이벤트가 호출됩니다. 큐는 실제로 NSMutuableArray입니다. 쓰기 부분에서 나는 addobject : 을 사용하고 읽기 부분에서 나는 objectAtIndex : 0을 사용합니다.

어떤 문제에 대해 어떻게 생각 하시나요?

답변

0

이 같은 배열을 사용하는 당신이 그렇지 않으면 응용 프로그램 충돌이 발생할 수 있습니다 액세스 안전하게 확인해야합니다

접근 A : (사용 그랜드 센트럴 파견)

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);//set priority as per requirement 

// 읽기

dispatch_async(queue, ^{ 

        while (//condition to stop) 
        { 
         //Perform read operation    
        } 
       }); 

// 쓰기

dispatch_async(queue, ^{ 

        while (//condition to stop) 
        { 
         //Perform write operation   
        } 
       }); 

작업은 배열 안전하게

접근 B에 액세스 같은 큐에서 수행됩니다 //로 :

두 개의 스레드

  1. 읽기 스레드를 만들 수 (사용하여 스레드)

  2. 라이트 트레드

그러나 동기화 된 방식으로 어레이에 액세스하십시오.

+0

A : dispatch_async가 동시에 시작 되었습니까? 처음에는 같은 생각을했습니다. 그러나 나는 그것의 확실하지 않았다. –

+1

dispatch_async이므로 실행을 기다리지 않고 즉시 다음 줄로 이동합니다. 따라서 첫 번째 블록이 제출되고 두 번째 블록이 제출됩니다. 어떻게 실행되는지는 GCD가 어떻게 CPU주기를 제공하는지에 달려 있습니다. –

+0

아이디어를 주셔서 감사합니다. 나는 나중에 이것을 시도 할 것이다. 지금은 두 작업의 대기열에 액세스 할 수 있습니다. 다른 객체에 액세스 할 때 아무런 문제가 없습니다. :) –

관련 문제