2009-08-04 6 views
1

두 개의 별도 비동기 인터넷 조회를 만들고 싶습니다. 그러나, 그들은 서로에 족답하고 나는 확실하지 않다 왜.우연히 동일한 obj-C 객체를 두 번 호출합니다.

주위를 파다 보면 두 룩업이 모두 같은 개체에서 작동하는 것으로 보입니다 (증상 : 두 번째 호출이 첫 번째 호출로 설정된 "thisPage"를 재설정 함).

아마도 위임자 사용과 관련이 있습니다 (여전히이 영역에서는 편하지 않습니다).


내가 클래스 CSNET을 만든 내가 그것을 초기화 :

[startupPage getPage:self page:pageName]; 

과 :

[positionUpdatePage getPage:self page:pageName]; 
나중에

CSNet    *startupPage; 
CSNet    *positionUpdatePage; 
startupPage = [[CSNet alloc] init]; 
positionUpdatePage = [[CSNet alloc] init]; 

을, 나는 각 개체를 사용하려고

모듈 수준 변수 :

enum pageType {nothing, startup, positionUpdate, acquireOpponents, fire, changeCredentials}; 
enum pageType thisPage; 

getPage 전화 :

-(void)getPage:(id)delegate page:(NSString *)page { 
m_Delegate = delegate; 
if ([[page substringToIndex:2] isEqual:@"st"]) { 
     thisPage = startup; 
} else { 
    if ([[page substringToIndex:2] isEqual:@"pu"]) { 
     thisPage = positionUpdate; 
    } else { 
     if ([[page substringToIndex:2] isEqual:@"ao"]) { 
      thisPage = acquireOpponents; 
     } else { 
      if ([[page substringToIndex:2] isEqual:@"fi"]) { 
       thisPage = fire; 
      } else { 
       if ([[page substringToIndex:2] isEqual:@"cc"]) { 
        thisPage = changeCredentials; 
       } 
      } 
     } 
    } 
} 

NSURLRequest *startupRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:[ 
    [NSString stringWithFormat: @"%@%@", SERVER, page] 
    stringByReplacingOccurrencesOfString:@" " withString:@"%20"]]]; 
startupConnection = [[NSURLConnection alloc] initWithRequest:startupRequest delegate:self]; 

if(startupConnection) 
{ 
    workInProgress = YES; 
    m_RequestData = [[NSMutableData data] retain]; 
} 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 

// this method is called when the server has determined that it 
// has enough information to create the NSURLResponse 
// it can be called multiple times, for example in the case of a 
// redirect, so each time we reset the data. 
// receivedData is declared as a method instance elsewhere 
[m_RequestData setLength:0]; 

} 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
// append the new data to the receivedData 
// receivedData is declared as a method instance elsewhere 
[m_RequestData appendData:data];  
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
// release the data object 
[m_RequestData release]; 

// inform the user 
NSLog(@"Connection failed! Error - %@ %@", [error localizedDescription], [[error userInfo] objectForKey:NSErrorFailingURLStringKey]); 
workInProgress = NO; 
} 

대리인에게 다시 반환 : 당신은 대리인에게 방법을 전송하는 객체를 추적하고에 분명히 두 개의 연결을 처리 할 수 ​​

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
if(workInProgress == YES) { 
    workInProgress = NO; 
    switch (thisPage) { 
     case startup: 
      //if ([m_Delegate respondsToSelector:@selector(startupReady:)]) 
       [m_Delegate startupReady:m_RequestData]; 
      break; 
     case positionUpdate: 
      //if ([m_Delegate respondsToSelector:@selector(positionUpdateReady:)]) 
       [m_Delegate positionUpdateReady:m_RequestData]; 
      break; 
     case acquireOpponents: 
      //if ([m_Delegate respondsToSelector:@selector(opponentsReady:)]) 
       [m_Delegate opponentsReady:m_RequestData]; 
      break; 
     case fire: 
      //if ([m_Delegate respondsToSelector:@selector(fireReady:)]) 
       [m_Delegate fireReady:m_RequestData]; 
      break; 
     case changeCredentials: 
      //if ([m_Delegate respondsToSelector:@selector(changeCredentialsReady:)]) 
       [m_Delegate changeCredentialsReady:m_RequestData]; 
      break; 
     default: 
      break; 
    } 
    [m_RequestData release]; 
} 
} 
+0

변수가 대리인 개체에 있습니까? – Daniel

+1

정확히 무슨 일이 일어나는지보기에는 충분하지 않습니다. 어떤 변수가 덮어 쓰여지고 있습니까? 전체 CSNet 클래스와이를 호출하는 클래스를 게시하고 좀 더 자세하게 설명 할 수 있습니까? –

+0

두 클래스가 매우 큽니다. 그래서 나는 불필요한 세부 사항을 압도하지 않으려 고 노력하고 있습니다. 나는 정확한 양의 세부 사항을 포함 시키려고 편집 할 것이다. – BankStrong

답변

4

thisPage은 모듈 수준의 변수입니다. 나는 그것이 인스턴스 변수가 아니라는 것을 의미한다고 가정합니다. 이 경우 모든 CSNet 인스턴스간에 공유되는 변수는 thisPage입니다. 당연히 두 개가 동시에 실행되면 서로 충돌 할 것입니다.

CSNet의 각 인스턴스에 고유 한 thisPage 변수가 있으면 인스턴스 변수로 지정하십시오.

+0

Dead on -이 페이지가 clobbered되었습니다 (나는 선언 할 수있는 영역의 차이를 이해하지 못했습니다). 엄청 고마워. – BankStrong

2

같은 위양 객체. -connection:didReceiveResponse:과 같은 대리자 메서드의 메서드 서명을 살펴보면 첫 번째 매개 변수는 메시지를 보내는 연결입니다. 귀하의 경우 이것은 -getPage:page:을 두 번 호출하여 생성하는 두 객체 중 하나가됩니다. 따라서 해당 객체를 추적하고 어떤 객체가 위임 메소드를 호출하는지 테스트하십시오.

+0

위 코드를 추가하여 명확히했습니다. 어떤 객체에서 응답을 얻었는지 말할 수 있지만 하나는 다른 객체를 덮어 씁니다. – BankStrong

+0

@BankStrong - 위의 코드에서 아무것도 생기지 않습니다. NSURLConnection 대리자 메서드 및 m_Delegate가 사용되는 모든 위치를 게시 할 수 있습니까? –

관련 문제