2014-03-31 3 views
0

다음 코드는 사용자 위치를 추적하고 사용자가 JSON 파일의 지정된 이벤트 중 하나에있는 경우 현재 사용자 위치의 long 및 lat를 long과 일치시킴으로써 탐지합니다 오늘 이벤트의 위도 + 이벤트 시작 시간이 현재 iPhone 시간과 같을 때 다음 지침을 수행 한 다음 NSTimer를 5 분 동안 실행하고 5 분 후이 메서드를 onTick() 메서드를 호출하면 시작 시간 그리고 5 분이 지나면 현재 시간은 5 분을 경과하고, 여전히 5 분 이상 지속되면이 이벤트를 참석 한 것으로 설정하십시오. 것은 나의 iPhone에 그것을 시험 할 때 작동한다 그러나 나가 사용자가 그 시간 인 단지 존재하는 사건을 위해 일하고 싶었더라도 5 분 이상 시간 간격을 가진 모든 사건을 위해 !! 일어나고있는 무엇이 솔루션 .. 임 정말 혼동 될 수 있다는 이유 누군가가 여기에 NSTimer 위치 추적 (업데이트)

내 코드입니다 .. 나를 위해 설명 plzzz 수 있습니다

.h file 
    @property (nonatomic, strong) Event *currentEvent; 
    @property (nonatomic, strong) CLLocation *currentEventLocation; 
    @property (nonatomic, strong) NSDate *arrivalDate; 
    @property (nonatomic, strong) CLLocation *currentLocation; 
    @property (nonatomic, strong) CLLocation *theNewLocation; 



    .m file 
- (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { 

self.currentLocation = [locations lastObject]; 

if (self.currentEvent) { 
    if ([self.arrivalDate timeIntervalSinceNow]<60*3) { 
     if ([self.currentEventLocation distanceFromLocation:self.theNewLocation]<100) { 
      [self.currentEvent setHasATTENDED:[NSNumber numberWithBool:TRUE]]; 
     } 
    } 
} 

self.currentLocation = self.theNewLocation; 

for (Event *event in [self loadTodaysEvents]) { 

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
    NSDate *currentTime = [NSDate date]; 
    [dateFormatter setDateFormat:@"HH:mm"]; 
    NSString *resultString = [dateFormatter stringFromDate:currentTime]; 

    NSString *eventStartTime = event.startingTime; 

    // distance 
    CLLocationDegrees lat = [event.lat doubleValue]; 
    CLLocationDegrees lon = [event.longi doubleValue]; 
    CLLocation *evLocation = [[CLLocation alloc] initWithLatitude:lat longitude:lon]; 
    double distance = [evLocation distanceFromLocation:self.theNewLocation]; 

    // CLOSE ! 
    if (distance <= 100 && [resultString isEqualToString:eventStartTime]) { 
     self.arrivalDate = currentTime; 
     self.currentEvent = event; 
     self.currentEventLocation = evLocation; 
     NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval: 180.0 
                  target: self 
                 selector: @selector(onTick:) 
                 userInfo: nil 
                 repeats: NO]; 

     NSRunLoop *runner = [NSRunLoop currentRunLoop]; 
     [runner addTimer:timer forMode: NSDefaultRunLoopMode]; 
    } 
    } 
} 



- (void)onTick:(NSTimer *)timer 
{ 
    [self locationManager:nil didUpdateLocations:@[self.currentLocation]]; 
} 


- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { 

} 
+0

, 당신은 runloop에 광고가에 필요 없어요! –

+0

[NSDate date]를 NSString으로 변환하고 NSDate로 되 돌리는 이유는 무엇입니까? –

+0

나는이 선이 의미가 있다고 생각하지 않는다! 이 이벤트 시작 시간이 현재 시간과 같은지 확인하고 싶은지 확인하십시오! [resultString isEqualToString : eventStartTime] –

답변

0

문제는 '당신의 onTick 방법 당신이 돈이다 당신이 같은 사건에 아직도 있는지 시험하지 마라! 방금 이벤트가 있는지 확인하십시오.

이 작업을 수행해야합니다

그는 현재 NSTimer에 참석 이벤트 저장 및 또한 이벤트 위치 :

NSDictionary* userInfo = 
[NSDictionary dictionaryWithObjectsAndKeys:event,@"event",evLocation,@"location", nil] 
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval: 180.0 
                  target: self 
                 selector: @selector(onTick:) 
                 userInfo:userInfo 
                 repeats: NO]; 

당신이 타이머를 호출하는 코드로 위의 코드를 교체합니다.

아이폰의 currentPosition을 저장해야합니다. 사용자가 이벤트를 떠 났는지 여부를 확인하기 위해 이동할 때!

이 또한 locationManager:didUpdateToLocation:fromLocation 호출에서 수행해야합니다. '

CLLocation *evLocation = timer.userInfo[@"location"]; 
Event *event = timer.userInfo[@"event"]; 

double distance = [evLocation distanceFromLocation:self.currentLocation]; 

    // CLOSE ! 
    if (distance <= 100) { 
    [event setHasATTENDED:[NSNumber numberWithBool:TRUE]]; 
       // save 
        NSError *error = nil; 
        if (![_managedObjectContext save:&error]) 
        { 
         NSLog(@"Error in saving"); 
        } 
    } 
} 

당신은 돈 :

그런 다음 onTick 방법 당신은 당신이 가까운 여전히 있는지 확인 예를 들어 @property (nonatomic, strong) CLLocation *currentLocation;

를 사용하고 locationManager:didUpdateToLocation:fromLocation의 첫 번째 줄에 단지 self.currentLocation = newLocation;

설정 타이머가 5 분 후에 실행되었음을 이미 알고 있기 때문에 다시 시간을 확인해야합니다!

하지만이 방법에는 또 다른 문제점이 있습니다!

사용자가 이벤트 중에 iPhone 앱을 계속 실행해야 앱이 타이머 콜백을 수신합니다. locationManager:didUpdateToLocation:fromLocation 메서드의 모든 작업을 수행해야합니다. 앱이 백그라운드에있을 때에도 호출해야하기 때문입니다!

+0

emm u r 오른쪽 ..하지만 내가 선택기를 호출해야 NSTimer를 사용하려면 필요합니다 .. 거기에 다른 방법은 무엇입니까 ?? – user3066516

+0

나는 NSTimer를 전혀 사용하지 말아야한다는 것을 의미했습니다! (또는 적어도뿐만 아니라) –

+0

NSTimer –

0

앱이 백그라운드에서 작동해야하는 또 다른 답변입니다! 위치 관리자가 위치를 계속 업데이트해야하므로 사용자가 이동하고 locationManager:didUpdateToLocation:fromLocation:이 계속 호출되는 것을 알 수 있습니다!

@property (nonatomic, strong) Event* currentEvent; 
@property (nonatomic, strong) CLLocation* currentEventLocation; 
@property (nonatomic, strong) NSDate* arrivalDate; 
@property (nonatomic, strong) CLLocation* currentLocation; 



- (void) locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation { 

    if (self.currentEvent) { 
     if ([self.arrivalDate timeIntervalSinceNow]<60*5) { 
      if ([self.currentEventLocation distanceFromLocation:newLocation]<100) { 
       [self.currentEvent setHasATTENDED:[NSNumber numberWithBool:TRUE]]; 
      } 
     } 
    } 
    self.currentLocation = newLocation; 

    for (Event *event in [self loadTodaysEvents]) { 

     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
     NSDate *currentTime = [NSDate date]; 
     [dateFormatter setDateFormat:@"HH:mm"]; 
     NSString *resultString = [dateFormatter stringFromDate:currentTime]; 

     NSString *eventStartTime = event.startingTime; 

     // distance 
     CLLocationDegrees lat = [event.lat doubleValue]; 
     CLLocationDegrees lon = [event.longi doubleValue]; 
     CLLocation *evLocation = [[CLLocation alloc] initWithLatitude:lat longitude:lon]; 
     double distance = [evLocation distanceFromLocation:newLocation]; 

     // CLOSE ! 
     if (distance <= 100 && [resultString isEqualToString:eventStartTime]) { 
      self.arrivalDate = currentTime; 
      self.currentEvent = event; 
      self.currentEventLocation = evLocation; 
      NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval: 300.0 
                   target: self 
                  selector: @selector(onTick:) 
                  userInfo: nil 
                  repeats: NO]; 

      NSRunLoop *runner = [NSRunLoop currentRunLoop]; 
      [runner addTimer:timer forMode: NSDefaultRunLoopMode]; 
     } 
    } 
} 

- (void)onTick:(NSTimer *)timer 
{ 
    [self locationManager:nil didUpdateToLocation:self.currentLocation fromLocation:self.currentLocation]; 
} 

업데이트 된 코드 : 타이머가 이미 예정되어 있기 때문에

@property (nonatomic, strong) Event* currentEvent; 
@property (nonatomic, strong) CLLocation* currentEventLocation; 
@property (nonatomic, strong) NSDate* arrivalDate; 
@property (nonatomic, strong) CLLocation* currentLocation; 



- (void)locationManager:(CLLocationManager)manager didUpdateLocations:(NSArray *)locations { 
    CLLocation currentLocation = [locations lastObject]; 

    if (self.currentEvent) { 
     if ([self.arrivalDate timeIntervalSinceNow]<60*5) { 
      if ([self.currentEventLocation distanceFromLocation:newLocation]<100) { 
       [self.currentEvent setHasATTENDED:[NSNumber numberWithBool:TRUE]]; 
      } 
     } 
    } 
    self.currentLocation = newLocation; 

    for (Event *event in [self loadTodaysEvents]) { 

     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
     NSDate *currentTime = [NSDate date]; 
     [dateFormatter setDateFormat:@"HH:mm"]; 
     NSString *resultString = [dateFormatter stringFromDate:currentTime]; 

     NSString *eventStartTime = event.startingTime; 

     // distance 
     CLLocationDegrees lat = [event.lat doubleValue]; 
     CLLocationDegrees lon = [event.longi doubleValue]; 
     CLLocation *evLocation = [[CLLocation alloc] initWithLatitude:lat longitude:lon]; 
     double distance = [evLocation distanceFromLocation:newLocation]; 

     // CLOSE ! 
     if (distance <= 100 && [resultString isEqualToString:eventStartTime]) { 
      self.arrivalDate = currentTime; 
      self.currentEvent = event; 
      self.currentEventLocation = evLocation; 
      NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval: 300.0 
                   target: self 
                  selector: @selector(onTick:) 
                  userInfo: nil 
                  repeats: NO]; 

      NSRunLoop *runner = [NSRunLoop currentRunLoop]; 
      [runner addTimer:timer forMode: NSDefaultRunLoopMode]; 
     } 
    } 
} 

- (void)onTick:(NSTimer *)timer 
{ 
    [self locationManager:nil didUpdateLocations:@[self.currentLocation]];   
} 
+0

안녕하세요, 위의 코드는 몇 가지 경고를 준 이후 어쨌든 그것이 작동하지 않았기 때문에 몇 가지 수정을 수행 한 후 내 아이폰 장치와 함께 UR 코드를 테스트했습니다, 나는 그 특정 시간에 지정된 위치로 갔다. 이벤트는 참석 한 것으로 표시되었지만 불행히도 실제로는 아무 것도 나타나지 않았습니다. 왜 그런 일이 일어날 수 있는지 실마리가 있습니까 ?? 추신 : Plzz 질문에 위의 내 업데이트 된 코드를 확인 >> – user3066516