在调度队列中从服务器检索数据时,如何处理应用程序进入后台?

时间:2014-02-01 17:23:40

标签: ios grand-central-dispatch

我正在创建一个应用程序,我从服务器检索数据,如下所示:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

    [self retrievedatafromserver];

    dispatch_async(dispatch_get_main_queue(), ^{

        //UIUpdation, fetch the image/data from DB  and update into your UI
    });

});

即使应用程序转到后台,如何从服务器检索数据?

谢谢&问候 sumana

2 个答案:

答案 0 :(得分:1)

如果您的项目范围仅在iOS 7中,那么您可以使用iOS 7及更高版本中的新背景模式。您可以在后台模式下获取数据,而无需任何额外的编码工作。

Background fetch

  [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];

现在您的应用已经知道要启动后台提取,让我们告诉它该怎么做。方法-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler将有助于这样做。每次执行后台提取时都会调用此方法,并且该方法应包含在AppDelegate.m文件中。完整版本如下:

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    UINavigationController *navigationController = (UINavigationController*)self.window.rootViewController;
    id topViewController = navigationController.topViewController;
    if ([topViewController isKindOfClass:[ViewController class]]) {
        [(ViewController*)topViewController insertNewObjectForFetchWithCompletionHandler:completionHandler];
    } else {
        NSLog(@"Not the right class %@.", [topViewController class]);
        completionHandler(UIBackgroundFetchResultFailed);
    }
}

现在在您的控制器中。喜欢那样

- (void)insertNewObjectForFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    NSLog(@"Update the tableview.");
    self.numberOfnewPosts = [self getRandomNumberBetween:0 to:4];
    NSLog(@"%d new fetched objects",self.numberOfnewPosts);
    for(int i = 0; i < self.numberOfnewPosts; i++){
        int addPost = [self getRandomNumberBetween:0 to:(int)([self.possibleTableData count]-1)];
        [self insertObject:[self.possibleTableData objectAtIndex:addPost]];
    }
    /*
     At the end of the fetch, invoke the completion handler.
     */
    completionHandler(UIBackgroundFetchResultNewData);
}

注意: - 如果您必须在iOS 6及更低版本上提供支持,请避免使用此方法。因为它不可用。

答案 1 :(得分:0)

当您的应用进入后台模式时。你可以访问代码几秒钟。假设后台队列仍在执行并且您输入了背景。然后你可能需要在应用程序输入前景时调用该方法。 (取一个bool变量并检查过程是否完成,如果过程完成没有问题。如果不再调用该方法。)。

如果您想让应用程序在后台模式下运行,那么您需要在plist中请求后台运行模式。请参阅此链接仅供参考我们可以激活后台运行模式的这些功能,您可以根据您的使用情况激活其中任何一个http://blogs.innovationm.com/support-for-applications-running-in-background-ios/