2011-09-20 7 views
0

은 내가 전화 할 때 다음이블록의 계산 시간을 계산하는 방법은?

#define TOOLS_COMPUTE_TIME(op) [Tools computeTimeWithName:__PRETTY_FUNCTION__ block:(op)] 

+(void)computeTimeWithName:(NSString *) caller block:(void (^)())block 
{ 
    NSDate * currentTime = [NSDate date]; 
    block(); 
    DLog(@"Time Running is: %f", [[NSDate date] timeIntervalSinceDate:currentTime]); 
    DLog(@"Caller : %@", caller); 
} 

과 같은 TOOLS_COMPUTE_TIME을 정의입니다 : "매크로"TOOLS_COMPUTE_TIME처럼 ..

TOOLS_COMPUTE_TIME(^{ 

}); 

[Tools computeTimeWithName:ThisFunction block:^{ 
    //I want to move this blog on top 
    NSString * urlString = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%f,%f&output=csv",[BNUtilitiesQuick UtilitiesQuick].currentAnchor.coordinate.latitude,[BNUtilitiesQuick UtilitiesQuick].currentAnchor.coordinate.longitude]; 
    NSURL * Url= [NSURL URLWithString:urlString]; 
    NSString * result = [NSString stringWithContentsOfURL:Url encoding:NSASCIIStringEncoding error:nil]; 
    NSArray *lines = [result componentsSeparatedByString:@","]; 
    locationString =[NSString stringWithFormat:@"%@\"",[lines objectAtIndex:2]]; 
}]; 

여전히 많은 오류를 가지고 있어요는 "4 개 인수를 전달하지만, 단지 1 소요" 그 코드와 같은

뭔가 많은 인수를 가지고,하지만 난 블록처럼 그 코드를 통과 한 인수

어떤 생각 하나는 그것을 해결하는 데 도움이 될 수 있습니까?

에 다른 오류가있는 것 같습니다. PRETTY_FUNCTION NSString *이 아닙니다. 뭐?

답변

3

문제는 C 전처리 기가 obj-c 구문에 정통하지 않다는 것입니다. 당신은 당신의 매크로 소요를 말함으로써이 문제를 해결 얻을 수

#define TOOLS_COMPUTE_TIME(...) [Tools computeTimeWithName:__PRETTY_FUNCTION__ block:(__VA_ARGS__)] 

는 괄호 사이에 모든 것을 가지고 그것을 전달할 수 있습니다이 방법을 가변 인자. 어쨌든 실패해야하는 불균형 끝 괄호가있는 경우에만 오류가 발생하지만이 방법으로는 궁금한 컴파일러 오류가 발생할 수 있습니다.

문자열 오류의 경우 PRETTY_FUNCTION은 NSString이 아닌 C 문자열 (예 : char*)입니다. +[Tools computeTimeWithName:block:] 함수를 다시 작성하여 char*을 첫 번째 인수로 사용하거나 [NSString stringWithUTF8String:__PRETTY_FUNCTION__]을 전달하십시오 (이전의 방법보다 쉽습니다. 로그 형식 토큰을 %@ 대신 %s으로 변경하십시오).

부수적으로 NSDate는 표류하는 (의도적이든 그렇지 않든) 시계를 기반으로하고 변경 될 수 있으므로 런타임 런타임에 이상적이지 않습니다. 대신 mach absolute time에 있어야합니다. 운좋게도 CoreAnimation은 CFTimeInterval (예 : 초 단위)으로 표시된 마하 절대 시간을 반환하는 편리한 함수 CACurrentMediaTime을가집니다. 이 대신 블록의 안정적인 런타임을 파악할 수 있습니다.

+0

하하, 방금 귀하의 문제가 실제로 [내 잘못]임을 알았습니다 (http://stackoverflow.com/questions/7411027/how-to-nslog-calling-function/7411041#7411041). 아마도 varargs 매크로를 사용하기 위해 그 대답을 편집해야합니다. –

+0

#define TOOLS_COMPUTE_TIME (...) [도구 computeTimeWithName : [NSString stringWithFormat : @ "% s", __ PRETTY_FUNCTION__] 블록 : (__ VA_ARGS__)]을 사용합니다. –

관련 문제