我是ios7背景提取的新手。我正是这样做的。
这是appDelegate
中发生的事情:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSURL *url = [[NSURL alloc] initWithString:@"http://sample.com/api/home/lastnews"];
OldJson = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
}
请注意,这里我将整个JSON文件存储在一个字符串中,以便我可以用来检查新内容。
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
//HomepageView is the view controller that is supposed to be updated
HomepageView *homepage = [[HomepageView alloc] init];
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];
NSURL *url = [[NSURL alloc] initWithString:@"http://sample.com/api/home/lastnews"];
NewJson = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSURLSessionDataTask *task = [session dataTaskWithURL:url
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
completionHandler(UIBackgroundFetchResultFailed);
return;
}
if (![NewJson isEqualToString:OldJson])
{
completionHandler(UIBackgroundFetchResultNewData);
NSLog(@"New Data : %@",NewJson);
}
else
{
completionHandler(UIBackgroundFetchResultNoData);
NSLog(@"Old Json : %@",OldJson);
}
}];
// Start the task
[task resume];
}
现在测试整个过程,我只需运行应用程序。然后我将它发送到后台,然后当我在JSON文件中有新内容时,我使用Debug菜单中的Simulate Background Fetch操作。然后我打开应用程序但没有任何改变。
答案 0 :(得分:0)
首先将您的newJson存储在NSUserDefaults
中,如下所示
if (![NewJson isEqualToString:OldJson])
{
completionHandler(UIBackgroundFetchResultNewData);
NSLog(@"New Data : %@",NewJson);
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:NewJson forKey:@"newJson"];
}
View Controller中的第二个在ViewDidLoad
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refresh:) name: UIApplicationWillEnterForegroundNotification object:nil];
将此添加到您的viewWillAppear
-(void)viewWillAppear:(BOOL)animated{
[self loadData];
}
创建loadData
- (void)loadData {
// contains information the ViewController makes use of
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
textView.text = [defaults objectForKey:@"newJson"];
}
最后添加你的行动
-(IBAction)refresh:(id) sender {
NSLog(@"I ran");
[self loadData];
}
我对此进行了测试,但确实有效。
答案 1 :(得分:0)
三个问题:
无法保证JSON数据采用UTF-8格式。使用[NSData dataWithContensOfURL:...]
从不,从主线程访问URL。如果服务器没有响应,您的应用将会挂起。
非常糟糕:在后台获取处理程序中,您实际上是同步加载URL。然后然后你创建一个任务来再次加载它。所以你实际上加载了两次。