私のアプリケーションでは、最新のデータを取得するために特定の時間間隔、たとえば1時間後にxmlを取得するようにサーバーにリクエストを送信する必要があります。このアクティビティをバックグラウンドで実行したいのですが、これを実現する方法を誰かに提案できますか?
前もって感謝します!
私のアプリケーションでは、最新のデータを取得するために特定の時間間隔、たとえば1時間後にxmlを取得するようにサーバーにリクエストを送信する必要があります。このアクティビティをバックグラウンドで実行したいのですが、これを実現する方法を誰かに提案できますか?
前もって感謝します!
NSTimerを使用して繰り返しリクエストし、バックグラウンドスレッドでリクエストを実行する場合は、次のようにする必要があります。
backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler: ^{
[[UIApplication sharedApplication] endBackgroundTask:backgroundTask];
backgroundTask = UIBackgroundTaskInvalid;
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//start url request
});
//after url request complete
[[UIApplication sharedApplication] endBackgroundTask:backgroundTask];
backgroundTask = UIBackgroundTaskInvalid;
上記の問題を解決するために、サーバーにリクエストを送信して応答を解析するNSOperationを作成しました。これは、スレッドを使用するよりも非常に便利で優れています。
1.次のように特定の時間間隔の後に-(void)sendRequestToGetData:(NSTimer *)timerを呼び出すNSTimerインスタンスを作成しました。
//Initialize NSTimer to repeat the process after particular time interval...
NSTimer *timer = [NSTimer timerWithTimeInterval:60.0 target:self selector:@selector(sendRequestToGetData:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
2.次に、sendRequestToGetData内で、NSOperationを次のようにサブクラス化してNSOperationを作成しました。
-(void)sendRequestToGetData:(NSTimer *)timer
{
//Check whether user is online or not...
if(!([[Reachability sharedReachability] internetConnectionStatus] == NotReachable))
{
NSURL *theURL = [NSURL URLWithString:myurl];
NSOperationQueue *operationQueue = [NSOperationQueue new];
DataDownloadOperation *operation = [[DataDownloadOperation alloc] initWithURL:theURL];
[operationQueue addOperation:operation];
[operation release];
}
}
注:DataDownloadOperationはNSOperationのサブクラスです。
//DataDownloadOperation.h
#import <Foundation/Foundation.h>
@interface DataDownloadOperation : NSOperation
{
NSURL *targetURL;
}
@property(retain) NSURL *targetURL;
- (id)initWithURL:(NSURL*)url;
@end
//DataDownloadOperation.m
#import "DataDownloadOperation.h"
#import "XMLParser.h"
@implementation DataDownloadOperation
@synthesize targetURL;
- (id)initWithURL:(NSURL*)url
{
if (![super init]) return nil;
self.targetURL = url;
return self;
}
- (void)dealloc {
[targetURL release], targetURL = nil;
[super dealloc];
}
- (void)main {
NSData *data = [NSData dataWithContentsOfURL:self.targetURL];
XMLParser *theXMLParser = [[XMLParser alloc]init];
NSError *theError = NULL;
[theXMLParser parseXMLFileWithData:data parseError:&theError];
NSLog(@"Parse data1111:%@",theXMLParser.mParsedDict);
[theXMLParser release];
}
@end