2011-08-16 4 views
0

배열에 데이터가있을 때까지 실행되는 일종의 루프를 설정해야합니다. 약간의 배경 정보 : 애플리케이션은 서버와 통신하여 정보를 얻고 해당 정보를 배열에 채 웁니다. 해당 정보가 배열에 채워질 때만보기가 다음보기로 변경 될 수 있습니다.보기에 배열의 정보가 채워지기 때문입니다.배열에 데이터가있을 때까지 루프

이 루프는 어떻게 만듭니 까? 현재 NSTimer를 사용하고 있지만 내 요구에 적합하지 않습니다.

미리 감사드립니다. http://allseeing-i.com/ASIHTTPRequest/How-to-use

비동기 메인 스레드를 차단하고 응답이 돌아 오기를 기다릴 것을 의미 비동기 부분을 찾습니다

+1

왜 그 배열을 기다리는 중입니까? 배열을 채우는 동일한 코드 블록 만 컨트롤러에 데이터가 준비되었음을 알리는 것이 아닌가? – yan

+2

가능한 경우 서버와 함께 asychronus 콜백을 설정하려고합니다. 루프 설정은 비용이 많이들 수 있습니다. –

+0

Yan - 그 배열에는 다음보기에서 레이블/등을 채우는 정보가 있습니다. 데이터가 준비되었다는 것을 어떻게 알릴 수 있습니까? – Baub

답변

1

까지 루핑한다고 말하면 나는 실제로 을 의미한다고 가정합니다.까지 기다립니다.

첫 번째로 주 스레드에서이 대기를 잊어 버리면 주 스레드를 차단하지 말아야합니다.

루프 대신 잠금을 사용하여 조건을 기다리는 것이 좋습니다. 배열을 채울 때까지 기다리는 코드와 배열을 채우는 코드 사이에 공유 잠금이 필요합니다.

[sharedLock lockWhenCondition:MYConditionStateNoObjects]; 
// Your stuff to get the objects to add here. 
[sharedArray addObjectsFromArray:theObjectsToAdd]; 
[sharedLock unlockWithCondition:MYConditionStateHaveObjects]; 

그리고 배열 될 때까지 기다려야한다 수신기가 객체가 이렇게 있습니다 : 다음해야 할 배열을 채 웁니다

typedef enum { 
    MYConditionStateNoObjects, 
    MYConditionStateHaveObjects 
} MYConditionState; 
... 
sharedArray = [[NSMutableArray alloc] init]; 
sharedLock = [[NSConditionLock alloc] initWithCondition:MYConditionStateNoObjects]; 

귀하의 방법

먼저 이런 공유 상태 잠금을 만들 :

[sharedLock lockWhenCondition:MYConditionStateHaveObjects]; 
// ... Do something with the objects you got here 
[sharedArray removeAllObjects]; 
[sharedLock unlockWithCondition:MYConditionStateNoObjects]; 
0

다음과 같은 라이브러리를 사용하여 시도 할 수 있습니다.

+0

명백한 이유없이 다운 voting은 절름발이입니다. – user281300

+0

왜 당신이 downvoted되었는지 잘 모르겠지만 아직 귀하의 응답을 조사하지 않았습니다. – Baub

+0

아마도 절름발이 인 것 같습니다. 어쨌든 당신이 기본적으로 웹에서 데이터를 가져와 어떤 종류의 테이블에 채우려 고합니다. 한 가지 방법은 비동기 요청을 사용하고 연결 수신 방법을 살펴 보는 것입니다. 거기에 배열을 채운 다음 테이블에 데이터를 다시로드하도록 알릴 수 있습니다. – user281300

0

생각이 났을 때 데이터를 처리해야하는 순간이 있습니다. 서버에서 배열에 추가되었습니다. 그렇다면 왜 KVO 기능을 사용하고 싶지 않으십니까? 배열 내용 변경을 수신하는 옵저버를 추가 할 수 있습니다.