2012-05-26 2 views
2

xcode에서 작동합니다. void가 아닌 메소드를 작성한 경우 클래스/메소드에서 호출하면 결과가 최적의 경우에만 처리됩니다. 지연을 삽입하여 테스트를 시도했지만 더 이상 작동하지 않는다는 것을 깨달았습니다. 여기 내가 만든 예제를 적어됩니다지연을 사용하여 리턴으로 메소드를 생성합니다.

//--------------------CLASS B  
-(int)method1 { 
    [self performSelector:@selector(method2) withObject:NULL afterDelay:1]; 
    return a; 
} 

-(void)method2 { 
    a = 800; 
} 

은 분명히 내 문제는 너무 사소한 일이 아니라

//--------------------CLASS A 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    i = 0; 
    Class *classB = [[Class alloc] init]; 
    i = [classB method1]; 
    [self performSelector:@selector(method3) withObject:NULL afterDelay:1.8]; 
} 

-(void)method3 { 
    NSLog(@"i = %i",i); // i = 0 
} 

클래스 B는 I가 시도 클래스 가능한 한 철저하게 답변을 얻으려면 쉽게, 모달 방법을 사용하도록 권고했지만 그게 내가 찾던 해결책이라고 생각하지 않습니다.

이 문제를 해결하려면 어떻게해야합니까?!

+0

가장 좋은 방법은 작업 완료를 기다리는 비동기 호출을 사용하는 것입니다.이 작업은 GCD를 사용하여 매우 쉽게 할 수 있습니다. – Simon

+0

좀 더 구체적으로 알려주시겠습니까? – Filoo

+0

michaels 접근 방식이 대리인과 함께하면 더 좋습니다! – Simon

답변

2

정말 필요한 것은 비동기 메서드를 더 잘 이해하는 것입니다. method1에서 변수 a은 절대로 변경되지 않습니다. 앞으로 method2을 호출 한 다음 변수 a의 현재 상태를 반환하도록 예약하는 것뿐입니다.

Objective-C에는이 문제를 해결할 수있는 몇 가지 방법이 있습니다. 사람들은 가장 일반적으로 protocolsdelegates을 사용하여이 문제를 해결합니다. 다음은 기본 intro to protocols and delegates입니다. 기본적으로 클래스 A 객체가 클래스 B 객체의 대리인이되기를 원할 것입니다. NSNotifications 또는 blocks을 사용할 수도 있지만, 알림 및 블록으로 이동하기 전에 프로토콜 및 대리자 (Objective-C에서는 매우 중요 함)의 사용법을 이해해야합니다.

+0

링크에 많은 도움을 주신 데다가 대리인을 사용하여 모든 것을 해결할 수 있기를 바랍니다. – Filoo

+0

@Filoo 대리인은 다른 개체의 동작을 사용자 지정하여 해당 개체를 결정할 수있는 "도우미 개체"입니다. ClassB가 여러 가지 상황에서 재사용되는 클래스가 아니라면 위임은 원하는 것이 아닙니다.당신은 이미 객체를 가지고 있습니다. 당신은 아마도 그것으로 약간의 데이터를 돌려 주려고합니다. 인스턴스 변수 나 속성은 아마도 필요한 것일 것입니다. – Caleb

+0

네, 저는 자산에 대해서도 생각해 봤습니다.하지만이 방법을 사용하기 시작한 이래로 나는 그것을 할 수있는 방법이 있는지 이해하고 싶었습니다. 정보를 주셔서 감사합니다. – Filoo

2

이 문제를 해결하려면 어떻게해야합니까?!

여기서 으로 되 돌리시겠습니까? 귀하의 예에서 method1method2이 호출되기 훨씬 오래 걸릴 것입니다. method2으로 계산 된 값을 유지하려면 일반적으로 해당 메서드를 ClassB의 인스턴스 변수 중 하나에 저장하고 처리를 계속할 수있는 다른 메서드를 호출 할 수 있습니다.

method1의 결과를 method2에서 반환해야하는 경우 동 기적으로 호출해야합니다 (즉, -performSelector:withObject:afterDelay:없이). 이 경우, a) 왜 지연이 필요한지; 그리고 b) 대신 지연 후 method1을 호출해야하는 경우.

해결하려는 실제 문제가 무엇인지 설명 할 수 있다면 더 많은 도움을 드릴 수 있습니다.

관련 문제