2

표준 위치 서비스를 사용해야하고 일부 네트워크 호출을 포함하여 일부 알림 처리를 수행해야하며 모든 위치 업데이트가 통지됩니다. 위치 업데이트를 FIFO 순서로 처리하고 장치 추적을 유지하며 결과를 최대한 빨리 얻어야합니다. 위치를 순서대로 처리하고 처리가 겹치지 않도록 (그리고 빠른 응답 이외에도) 작업 대기열, 작업 대기열 또는 스레드를 직접 (또는 존재하는 경우 다른 방법으로) 보장하는 가장 좋은 방법이나 기술이어야합니다. ? 작업 대기열과 디스패치 대기열은 성능면에서 거의 동일하지만 디스패치 대기열은 처리하기가 쉬운 것처럼 보입니다. 따라서 각각의 이점이 무엇인지 모릅니다. 스레드에 관해서는 일반적으로 사용하지 않는 것이 좋지만 작업/디스패치 큐에 대한 효율성이 실제로 눈에 띄는 것인지, 사용 가치가 있는지는 잘 모르겠습니다. 당신이 물건을 백그라운드에서 동시에 작동하지 않을 경우 사전CLLocationManager 및 직렬 위치 업데이트 처리

답변

1

덕분에, 당신은 직렬 큐가 필요합니다. 직렬 GCD 큐 만들려면 :

dispatch_queue_t queue = dispatch_queue_create("com.appsdev.project1", 0); 

그리고 당신이 그 큐에 무언가를 추가 할 때마다, 단순히이다 :

dispatch_async(queue, ^{ 
    // do your background stuff 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // update the UI 
    }); 
}); 

당신이 NSOperationQueue를 사용하려면이 실질적으로 쉽게 :

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
queue.maxConcurrentOperationCount = 1; 
그리고 시리얼 큐에 작업을 추가합니다 :

[queue addOperationWithBlock:^{ 
    // do your stuff 

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
     // update the UI 
    }]; 
}]; 

그리고 NSThread 질문에 대한 대답으로, 나는 당신이 묘사 한 것에 기초하여 그것에 대한 필요성을 보지 못했습니다. 확실히 인식 할 수있는 성능 문제는 없습니다.

그런데 발송/작업 대기열에 추가하는 항목이 동 기적으로 작동하도록 보장됩니까 (즉, 지오 코딩 또는 자체가 비동기로 작동하는 지형지물을 수행하지 않는 경우입니까?)? 비동기 적으로 작동하는 경우 추가주의가 필요합니다. 당신은 단지 작업 큐를 사용하여, 가장 최근의 위치에 대해 관심이 있다면 그런데


, 당신은 또한 호출하여 아직 시작하지 않은 다른 작업을 취소 할 기회가 있습니다

[queue cancelAllOperations]; 

을 진행중인 작업이 먼저 완료됩니다 (코드가 취소되었는지 테스트하지 않은 경우). 그러나 아직 시작되지 않은 보류중인 작업은 최신 위치를 기반으로 새 요청을 시작하기 전에 쉽게 취소 할 수 있습니다. 위치 요청의 이 순차적으로 처리되도록할지 아니면 진행중인 처리를 완료하고 다른 처리를 지우고 새 위치를 기반으로 새 작업을 대기시킬 것인지 여부에 따라 달라집니다. 앱이 필요로하는 것에 달려 있지만 현재 위치 만 신경 써야하는 경우가 많습니다. 이렇게하면 대기열이 너무 많이 백 로그되지 않습니다.

+0

답해 주셔서 감사합니다. 거리 필터 및 정확도 설정에 따라 통보되는 모든 위치를 고려해야하며, 처리 방법에 관해서는 중요한 섹션이 있으며 각 위치마다 순서대로 실행되는지 확인해야합니다. 받은, 그리고 동시에 그들 중 하나에 대한. iOS에서는 스레드 사용이 권장되지 않으므로 세마포어없이 처리하는 방법을 알지 못합니다. – AppsDev

+0

내 위치 업데이트는 본문에서 차례로 다른 메소드를 호출하는 메소드를 트리거합니다. 작업/디스패치 대기열을 호출하는 방법은 첫 번째 위치의 전체 처리가 다음 위치를 처리하기 전에 완료된다는 것을 보장합니까? – AppsDev

+0

@AppsDev 해당 메소드는 모두 동기식으로 실행됩니다 (기본적으로이 메소드가 수행합니다). 그러나 비동기 작업을 수반 할 수도있는 질문에 의해 암시 된 몇 가지 가능성이 있습니다. 예를 들어,'CLGeocoder'를 사용하고 있습니까? 'NSULRConnection'을 사용하고 있습니까? (sendSynchronousRequest를 사용하지 않는 한)? 등등. 비동기 작업의 몇 가지 예입니다. (예 : Apple이 친절하게 비동기 작업을 제공하기까지 오랜 시간이 걸리는 것들이 있습니다. 이러한 비동기 작업은 위의 솔루션에 주름을 추가합니다.) 계획 한 코드를 살펴 봐야합니다. 전화. – Rob

관련 문제