cancelPreviousPerformRequestWithTarget не отменяет мой ранее отложенный поток, начатый с executeSelector - PullRequest
6 голосов
/ 19 мая 2010

Я запустил поток с задержкой, используя performSelector, но у пользователя все еще есть возможность нажать кнопку "Назад" в текущем представлении, вызывая вызов dealloc. Когда это происходит, кажется, что мой поток все еще вызывается, что приводит к сбою приложения, поскольку свойства, которые этот поток пытается записать, были освобождены. Чтобы решить эту проблему, я пытаюсь позвонить cancelPreviousPerformRequestsWithTarget, чтобы отменить предыдущий запрос, но, похоже, он не работает. Ниже приведены некоторые фрагменты кода.

- (void) viewDidLoad {
    [self performSelector:@selector(myStopUpdatingLocation) withObject:nil afterDelay:6];
}   

- (void)viewWillDisappear:(BOOL)animated {
        [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myStopUpdatingLocation) object:nil];
    }

Я что-то здесь не так делаю? Метод myStopUpdatingLocation определен в том же классе, в котором я вызываю запросы на выполнение.

Еще немного фона. Функция, которую я пытаюсь реализовать, заключается в том, чтобы находить местоположение пользователей, искать в Google некоторые местоположения вокруг этого местоположения и отображать несколько аннотаций на карте. На viewDidLoad я начинаю обновлять местоположение с CLLocationManager. Я строю тайм-аут через 6 секунд, если я не получаю желаемую точность в течение тайм-аута, и я использую performSelector для этого. Что может произойти, если пользователь нажмет кнопку «Назад» в представлении, и этот поток все равно будет выполняться, даже если все мои свойства были освобождены, что привело к сбою.

Заранее спасибо!

Джеймс

Ответы [ 2 ]

4 голосов
/ 19 мая 2010

Я обнаружил свою проблему, она не имела никакого отношения к моим звонкам на executeSelector. Я обнаружил, что вы должны установить свои MGMapView и delgate CLlocationManager равными нулю, прежде чем выпускать их. В противном случае они продолжат работать, даже если вы выпустили экземпляры, и у них есть вероятность сбить ваше приложение.

Спасибо за помощь, Ной!

2 голосов
/ 04 мая 2011

Я столкнулся с подобной проблемой, когда я не знал, что планировал несколько вызовов executeSelector для разных объектов, поэтому «я» в каждом случае было разным.

Я бы порекомендовал добавить NSLog (@ "Self:% @", self); до каждого из ваших битов кода, таких как:

- (void) viewDidLoad {
    NSLog(@"Self: %@",self); before
    [self performSelector:@selector(myStopUpdatingLocation) withObject:nil afterDelay:6];
}   

- (void) viewWillDisappear:(BOOL)animated {
    NSLog(@"Self: %@",self); before
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myStopUpdatingLocation) object:nil];
}

Это позволит вам сравнивать экземпляры SELF, чтобы убедиться, что вы выполняете и отпускаете селекторы для одного и того же объекта.

...