在applicationDidEnterBackground上使用AFNetworking 2.0发送GET请求

时间:2014-05-20 01:47:14

标签: ios objective-c afnetworking-2

我正在尝试在进入后台时使用AFNetworking 2.0下载一个小文件。无论出于何种原因,NSLog都不会出现在控制台中。

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
[manager GET:@"SOMEURLHIDDEN" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"%@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@",error);
}];

2 个答案:

答案 0 :(得分:3)

这是您应该考虑的事项(取自this StackOverflow question):

  

AFHTTPRequestOperationManager使用旧版NSURLConnection   不利于后台下载。

     

AFURLSessionManager在引擎盖下使用NSURLSession,这样做

话虽如此,如果由于某种原因你坚持使用AFHTTPRequestOperationManager继续阅读。

如果您尝试在applicationDidEnterBackground:或类似代码中运行此代码,那么您在控制台中看不到任何内容的原因是可以理解的。当应用程序进入后台时,操作系统可以随时将其置于挂起状态,这可能是您的情况中发生的事情(请阅读有关App States的更多信息)。如果您需要更多时间来运行代码,那么您必须通过调用以下方式明确要求:

__block UIBackgroundTaskIdentifier backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{}

这应该放在您希望在后台运行的代码之前。

一旦您的应用程序已用完,将暂停处理到期处理程序。完成你正在做的任何事情很重要(如果你没有完成,你应该取消GET请求)并致电:

[application endBackgroundTask:backgroundTaskIdentifier]

总而言之,您的所有代码应如下所示:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    __block AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    __block UIBackgroundTaskIdentifier backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [manager.operationQueue cancelAllOperations];
        [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskIdentifier];
    }];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    [manager GET:@"SOMEURLHIDDEN" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"%@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"%@",error);
    }];
}

答案 1 :(得分:0)

我在SDWebimage库中找到。

#if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0
    if ([self shouldContinueWhenAppEntersBackground]) {
        __weak __typeof__ (self) wself = self;
        self.backgroundTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
            __strong __typeof (wself) sself = wself;

            if (sself) {
                [sself cancel];

                [[UIApplication sharedApplication] endBackgroundTask:sself.backgroundTaskId];
                sself.backgroundTaskId = UIBackgroundTaskInvalid;
            }
        }];
    }
#endif