2014-11-02 3 views
0

Я очень ново в теме, поэтому, пожалуйста, будьте любезны.Остановить поток в другом контроллере View

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

Когда пользователь выходит из системы, я хочу отменить поток, созданный для сбора геолокации каждые 30 секунд.

Как это сделать?

Я подхожу к этому правильно? Если нет, примеры и объяснения кода нравятся

Большое спасибо !!!!

Логгин View Controller

... 
- (IBAction)loginButton:(id)sender { 
    NSInteger success = 0; 

    //Check to see if the username or password texfields are empty or email field is in wrong format 
    if([self validFields]){ 
     //Try to login user 
     success = [self loginUser]; 
    } 
    //If successful, go to the MainView 
    if (success) { 
     //Start getting users Geolocation in a thread 
     [NSThread detachNewThreadSelector:@selector(startGeolocation:) toTarget:self withObject:nil]; 

     //Go to Main view controller 
     [self performSegueWithIdentifier:@"loginSuccessSegue" sender:self]; 
    } 
    else 
    { 
     //Reset password text field 
     self.passwordTextField.text = @""; 
    } 
} 
... 
//Thread to get Geolocation every 30 seconds 
-(void)startGeolocation:(id)param{ 
    self.geoLocation = [[GeoLocation alloc] init]; 
    while(1) 
    { 
     //****************START GEOLOCATION*******************************// 
     AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
     [appDelegate.databaseLock lock]; 
     NSLog(@"Geolocation:(%f,%f)", [self.geoLocation getLatitude], [self.geoLocation getLongitude]); 
     sleep(30); 
     [appDelegate.databaseLock unlock]; 
    } 
} 

Главная View Controller

... 
//When the Logout Button in MenuView is pressed this method will be called 
- (void)logoutButton{ 

    //Cancel the geolocation tread 
    //????????????????????????????   

    //Log the user out 
    [self logoutUser] 
} 
... 
+1

Попробуйте использовать очереди вместо потоков напрямую. Посмотрите на GCD и [Руководство по программированию параллелизма] (https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html) – Abizern

+0

NSOperationQueue или NSTimer будут лучше, чем что во время сна комбо. –

+0

И вы можете отменить очередь или таймер при выходе из системы. –

ответ

1

Я бы рекомендовал использовать GCD для этого.

dispatch_queue_t dq = dispatch_queue_create("bkgrndQueue", NULL); 
dispatch_async(dq, ^{ 
    @autoreleasepool{ 
    while(SEMAPHORE_NAME){ 
     // do stuff in here 
    } 
    } 
} 

, а затем в вашем другом контроллере представления

SEMAPHORE_NAME = NO; 
+0

, где будет одно место SEMAPHORE_NAME, чтобы убедиться, что оно доступно для всех контроллеров представления? Что это за тип? - Спасибо большое – lr100

+1

bool/BOOL/Bool, и вы должны объявить его как extern в своем AppDelegate (создать «суперглобал») – TheLivingForce

+0

Спасибо. Это решение работает для меня! – lr100

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