2014-01-09 2 views
0

앱에서 서버의 업데이트를 지속적으로 확인해야하는 iOS 앱을 만들어야합니다 (30 초마다 가능). 하지만 앱이 포 그라운드에서 실행될 때만 가능합니다.
배터리가 방전되는 것을 알고 있지만 인터넷이없는 환경에서 작동합니다. 따라서 푸시 알림을 사용할 수 없습니다.
iOS 서버에서 데이터를 정기적으로 읽음.

내가 생각할 수있는 옵션은 30 초마다 서버에 요청을 보내고 업데이트를받는 것입니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? NSTimer와 NSURLConnection 또는 다른 더 나은 접근 방법을 사용하고 있습니까?

또한 타이머를 사용하는 경우 앱이 백그라운드로 이동하면 일시 중지되어 다시 포어라운드로 실행됩니다. 백그라운드에서 앱을 죽일 수있는 기회가 있습니까?

감사 AFNetworking 2.0을 통해 설치에 쉽게 보이는 로켓 실시간 네트워킹에

+0

나는 이해할 수 없다. 인터넷이 없다면 어떻게 서버와 통신 할 것입니까? – Desdenova

+0

모든 것이 LAN 안에 있습니다. 그래서 우리는 서버에 로컬로 연결합니다. – Madhu

+0

아, 네 말이 맞아. 내 잘못이야. – Desdenova

답변

1

가장 좋은 방법은 백그라운드 스레드에서 이러한 작업을 관리하는 별도의 개체를 설정하는 것입니다. 그런 다음 귀하의 앱 대리인에서

- (void)applicationWillResignActive:(UIApplication *)application 

이 호출 될 때이 특수한 개체를 중지 시키면 모든 것이 동기화되고 필요에 따라 정리됩니다.

그런 경우 : 응용 프로그램이 다시 활성화수록

- (void)applicationDidBecomeActive:(UIApplication *)application 

가 호출되는, 다시 그 배경 스레드에서/설문 조사를 조회 할 개체를 신호. NSTimer하고있는 NSURLConnection 또는 다른 더 좋은 방법을 사용

@implementation PollingObject : NSObject 

- (id)init 
{ 
    if (self = [super init]) 
    { 
     _interval = 1; // 1 second interval 
     _cancel = NO; // default to NO 
     _isPolling = NO; // default to NO 

     // init your background queue 
     _pollQueue = dispatch_queue_create("com.yourconame.yourappname.pollQueue", NULL); 
    } 
    return self; 
} 

- (void)heartbeat 
{ 
    if (_cancel) 
    { 
     // stop the timer 
     [_timer invalidate]; 
     _isPolling = NO; 
     return; 
    } 

    // Runs the polling method ONCE on a background queue 
    dispatch_async(_pollQueue, ^{ 
     [self pollingMethod]; 
    }); 
} 

- (void)pollingMethod 
{ 
    // Do actual network polling work here...but only run it once. (don't loop) 
} 

- (void)startPolling 
{ 
    _cancel = NO; 
    if (_isPolling) 
    { 
     NSLog(@"Already polling"); 
     return; 
    } 

    // schedule the method heartbeat to run every second 
    _timer = [NSTimer scheduledTimerWithTimeInterval:_interval target:self selector:@selector(heartbeat) userInfo:nil repeats:YES]; 

} 

- (void)stopPolling 
{ 
    // we set the flag here and the next second the heartbeat will stop the timer 
    _cancel = YES; 
} 

@end 
+0

감사합니다. 그래서 내가해야 할 일은 GCD를 사용하여 스레드를 만들고 내부에 타이머를 넣고 applicationWillResignActive에서 멈추고 applicationDidBecomeActive로 다시 시작하는 것입니다. dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{nstimer = ....}); – Madhu

+0

타이머는 GCD 큐 외부에 있어야하며 매 간격마다 메소드를 실행하도록 설정해야합니다. 그러나 그 방법은 타이머를 멈추거나 별도의 GCD 또는 NSOperation 대기열 내에서 폴링 메소드를 실행할시기를 알고 있으므로 일종의 취소 플래그를 확인해야합니다. – valheru

+0

추가 예제 코드. 그것을 복사/붙여 넣기하지 마십시오. 그것을 이해하려고 노력하십시오. – valheru

1

:

귀하의 사용자 지정 개체는 다음과 같이 할 수있는이

@interface PollingObject : NSObject 
{ 
    NSTimer* _timer; 
    NSUinteger _interval; 
    BOOL _cancel; 
    BOOL _isPolling; 
    dispatch_queue_t _pollQueue; 
} 
- (void)startPolling; 
- (void)stopPolling; 
@end 

구현과 같은 인터페이스를 가질 수 있을까?

내 생각으로는 NSTimer와 NSURLConnection도 사용했습니다.

또한 타이머를 사용하는 경우 앱이 백그라운드로 이동하면 일시 중지되어 다시 포어라운드로 실행됩니다.

예, 그렇습니다. 정확하게 멈추지는 않지만 시뮬레이터에서 테스트 한 결과에 따라 효과가 비슷합니다. 타이머가 00:00:00, 00:00:30, 00:00:60, ...으로 설정되고 00:00:15에 앱을 배경으로 설정하고 00:00시에 다시 시작한다고 가정 해 봅시다. 45. 00:00:30에 발사 예정이었던 타이머는 재개 (00:00:45)하고 다음 발사 (00:00:60) 및 후속 발사가 예정대로 돌아올 때 즉시 작동합니다.

백그라운드에서 앱이 종료 될 가능성이 있습니까?

예, 있습니다. 그러나 앱이 시작될 때마다 타이머를 시작하면 문제가되지 않습니다. 맞습니까?

+0

감사합니다. 그래서 앱이 포어 그라운드로 올 때 타이머를 시작하고 백그라운드로 갈 때 타이머를 멈추기 위해서는 'valheru'에 의해 다른 답변과 비슷한 것을해야 할 것입니다. 그 맞습니까? – Madhu

+1

실제로 NSTimer는 앱이 백그라운드에있을 때 실행되지 않으므로 수동으로 중지 할 필요가 없습니다. '-application : didFinishLaunchingWithOptions :'에서 반복 타이머를 시작하라는 메시지를 보낸 다음 잊어 버릴 수 있습니다. –

+0

감사합니다. 하지만 앱이 다시 포 그라운드로 올 때 자동으로 다시 시작됩니까? – Madhu