2013-12-20 2 views
-1

Проведено некоторое исследование по этой теме, но до сих пор его нет.NSTimeInterval всегда 0

NSTimeInterval всегда 0 при использовании [NSDate timeIntervalSinceDate:NSDate].

Пример.

- (NSNumber*) elapsed 
    { 
    __block NSDate* currentDate; 
    dispatch_async(dispatch_get_main_queue(), 
     ^{ 
     currentDate = [NSDate date]; 
     }); 
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:self.transactionStartedAt]; 
    _elapsed = @(timeInterval*1000); 
    return _elapsed; 
    } 

Вы можете видеть, я использую dispatch_async в основную очередь потому, что это свойство геттер доступ из фоновой очереди и [дата NSDate] возвращает ноль, это, как я понял, чтобы решить эту проблему.

Тогда вы можете видеть, что я ищу временной интервал и конвертируюсь в миллисекунды между двумя датами.

EDIT: проблема с временным интервалом решена с помощью этого кода.

- (NSNumber*) elapsed 
    { 
    NSDate* currentDate = [NSDate date]; 
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:self.transactionStartedAt]; 
    NSLog(@"TimeInterval: %f", timeInterval); 
    return @(timeInterval*1000); 
    } 

Это фактически геттер в объекте, так что, если изменить код

- (NSNumber*) elapsed 
    { 
    NSDate* currentDate = [NSDate date]; 
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:self.transactionStartedAt]; 
    NSLog(@"TimeInterval: %f", timeInterval); 
    return _elapsed = @(timeInterval*1000); 
    } 

я получаю EXC_BAD_ACCESS неустранимое исключение.

У меня проблема с изменением значения из другой фоновой очереди, созданной тем, что объект создан!

С уважением.

+0

Почему GCD? 'dispatch_async (dispatch_get_main_queue(), ^ { currentDate = [NSDate date]; });' –

+0

Это отличный вопрос для другого сообщения stackoverflow, но я также упоминаю об этом. По какой-то причине, если я не делаю этого с GCD, я получаю значение [NSDate date] nil! Сумасшедший, я знаю. –

+0

[NSDate date] имеет неявное авторекламу, нет? – Larme

ответ

2

поэтому проблема ваш блок вызывается после

NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:self.transactionStartedAt]; 
_elapsed = @(timeInterval*1000); 
return _elapsed; 
} 

при использовании dispatch_async код вызывается на следующем цикле цикла выполнения. попробуйте отладить этот метод, чтобы увидеть, что я имею в виду

+0

Да, я понимаю. Хм, тогда моя проблема в том, что я получаю нуль, когда пытаюсь получить текущую дату с [NSDate date] сейчас. –

+0

@TaskosGeorge Я думаю, ваша проблема в отладке. Получение 'nil' из' [NSDate date] 'маловероятно. – Sulthan

+0

OK Я решил свою проблему, спасибо за ваш ответ, это было действительно полезно. –

3

В то время, когда вы звоните timeIntervalSinceDate, currentDate НЕ УКАЗАНА (он еще не назначен). Думаю, в этом случае компилятор решил сделать это nil. И вызов метода (отправка сообщения) на объект nil всегда возвращает 0.

Отправка блока асинхронно заставляет блок выполняться иногда позже, в этом случае, вероятно, после возврата метода. В этом случае он, вероятно, сделает некоторые очень плохие вещи в памяти, потому что он назначит переменной в стеке, которая будет уже недействительной.

+0

Я получаю то, что вы говорите. Теперь я удалил GCD, который, как я думал, так или иначе, это плохо, и я правильно понял интервал времени. Теперь я реализовал getter свойства и установил, как вы видите сгенерированное _elapsed поле, и когда возвращаете значение, я получаю BAD_EXC. Если я верну только значение timeinterval, он работает нормально. Я просто хочу понять, почему я получаю BAD_EXC. Есть предположения? –

+0

Вам нужно будет поделиться своим кодом еще раз. Однако ваш код немного странный. У вас есть геттер, который фактически изменяет ваш объект (присваивание в '_elapsed'). Итак, кто знает, что еще происходит. – Sulthan

+0

Фактически я изменяю значение. Отредактировал вопрос. –

Смежные вопросы