iOS:AFNetworking 的可达性
Posted
技术标签:
【中文标题】iOS:AFNetworking 的可达性【英文标题】:iOS: reachability for AFNetworking 【发布时间】:2014-02-26 11:14:15 【问题描述】:我以这种方式进行“批量操作”,效果很好
NSMutableArray *mutableOperations = [NSMutableArray array];
for (NSString *stringURL in url_list)
NSURL *url = [NSURL URLWithString:stringURL];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.responseSerializer = [AFHTTPResponseSerializer serializer];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
[self addDataToTotal:[self parseJSONfile:responseObject]];
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error: %@", error);
];
[mutableOperations addObject:operation];
NSArray *operations = [AFURLConnectionOperation batchOfRequestOperations:mutableOperations progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations)
NSLog(@"progress:%f", (float)numberOfFinishedOperations / totalNumberOfOperations);
completionBlock:^(NSArray *operations)
NSLog(@"All operations in batch complete");
[self startPopulateDBStructure:self.total];
];
[[NSOperationQueue mainQueue] addOperations:operations waitUntilFinished:NO];
现在我想使用“可达性属性”来检查连接状态,我这样做了
[[[NSOperationQueue mainQueue]reachabilityManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)
switch (status)
case AFNetworkReachabilityStatusReachableViaWWAN:
case AFNetworkReachabilityStatusReachableViaWiFi:
[[NSOperationQueue mainQueue] setSuspended:NO];
break;
case AFNetworkReachabilityStatusNotReachable:
default:
[[NSOperationQueue mainQueue] setSuspended:YES];
break;
];
但我收到此消息后出现崩溃,问题出在哪里?
[NSOperationQueue reachabilityManager]: unrecognized selector sent to instance
【问题讨论】:
【参考方案1】:您正在尝试从主NSOperationQueue
获取reachabilityManager
,它没有它。您应该使用[AFNetworkReachabilityManager sharedManager]
来获取reachabilityManager
实例。
所以:
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) ...
另外,请考虑尝试挂起主队列的逻辑。您可能想要做的是从您的 AFHTTPRequestOperationManager
实例中获取 operationQueue
并暂停它...
【讨论】:
我怎样才能得到它? 好的,这个“[AFNetworkReachabilityManager sharedManager]”适用于“[NSOperationQueue mainQueue]”??? 可达性管理器与操作队列无关。而且您似乎不太可能尝试暂停主队列... 那么我应该使用“AFHTTPRequestOperationManager”来执行我的批处理操作吗?而不仅仅是 NSOperationQueue 好的,但我不明白,因为在 AFNetworking 2.0 的指导方针中建议我这样做而不是使用管理器来进行批处理操作【参考方案2】:试试这个:
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)
switch (status)
case AFNetworkReachabilityStatusReachableViaWWAN:
case AFNetworkReachabilityStatusReachableViaWiFi:
[[NSOperationQueue mainQueue] setSuspended:NO];
break;
case AFNetworkReachabilityStatusNotReachable:
default:
[[NSOperationQueue mainQueue] setSuspended:YES];
break;
];
【讨论】:
【参考方案3】:您可以简化@simalone 的回答:
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)
[[NSOperationQueue mainQueue] setSuspended:![AFNetworkReachabilityManager sharedManager].reachable];
];
@Wain 是对的,暂停 mainQueue 听起来不是一个好计划。
使用AFHTTPRequestOperationManager
并分配您自己的操作队列。
【讨论】:
以上是关于iOS:AFNetworking 的可达性的主要内容,如果未能解决你的问题,请参考以下文章