Как сделать макрос для вычисления времени блока? - PullRequest
0 голосов
/ 20 сентября 2011

Я определяю TOOLS_COMPUTE_TIME, как это

#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 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]];
}];

, все равно есть много ошибок .. как "Макрос" TOOLS_COMPUTE_TIME "передал 4 аргумента,но занимает всего 1 "

что-то вроде этого кода имеет много аргументов, но я думаю, что код передает только один аргумент, как блок

кто-нибудь может мне помочь исправить это?

Кажется, другая ошибка относится к типу PRETTY_FUNCTION Это не NSString *, не так ли?Что?

1 Ответ

3 голосов
/ 20 сентября 2011

Проблема в том, что препроцессор C не разбирается в синтаксисе obj-c. Вы можете обойти это, сказав, что ваш макрос принимает varargs

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

Таким образом, между паренами будет что-нибудь и передано. Это не удастся, только если у вас несбалансированная конечная скобка, которая в любом случае должна завершиться неудачей, но вы, вероятно, получите любопытную ошибку компилятора таким образом.

Что касается строковой ошибки, PRETTY_FUNCTION - это строка C (например, char*), а не строка NSString. Либо переписайте вашу функцию +[Tools computeTimeWithName:block:], чтобы она взяла char* в качестве первого аргумента, либо вместо нее введите [NSString stringWithUTF8String:__PRETTY_FUNCTION__] (первый проще, просто измените токен формата для вашего журнала на %s вместо %@).

В качестве примечания, NSDate не идеален для вычисления времени выполнения, поскольку он основан на тактовом времени, которое подвержено смещению (преднамеренному или иному) и которое может измениться на вас. Вместо этого вы должны исходить из абсолютного времени маха . К счастью для вас, в CoreAnimation есть удобная функция CACurrentMediaTime, которая возвращает абсолютное время маха, выраженное в виде CFTimeInterval (например, в секундах). Вместо этого вы можете использовать это для определения надежного времени выполнения блока.

...