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 的可达性的主要内容,如果未能解决你的问题,请参考以下文章

iOS AFNetworking 3.0以上使用

iOS:AFNetworking 的可达性

iOS:可达性和 AFNetworking

AFNetworking 可达性 iOS

[AFN]AFNetworking错误总结

防止在首次启动 iOS 时调用 AFNetworking 可达性状态