我正在尝试在进入后台时使用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);
}];
答案 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