Car*_*izz 0 iphone asynchronous objective-c ios
我正在尝试创建一个异步NSURL请求,但我得到了所有"FALSE".
-(BOOL)checkConnectionForHost:(NSString*)host{
BOOL __block isOnline = NO;
NSURLRequest *request = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:host] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:1];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if([(NSHTTPURLResponse*)response statusCode]==200){
isOnline = TRUE;
}
}];
NSLog(@"%i",isOnline);
return isOnline;
}
Run Code Online (Sandbox Code Playgroud)
此外,当我实际上只使用它时,此代码被称为"6"次:
-(UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
Run Code Online (Sandbox Code Playgroud)
并且我的数据源中只有3个单元格或3个项目.第一次在Objective-C中处理异步和回调,所以非常感谢详细的答案!谢谢!
异步调用将并行执行,其结果将在完成块中接收.在您的情况下,将在完成异步请求之前执行return语句.这将永远是错误的.
您应该为此使用同步请求,并处理不阻止UI.
-(BOOL)checkConnectionForHost:(NSString*)host{
BOOL isOnline = NO;
NSURLRequest *request = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:host] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:1];
NSHTTPURLResponse *response;
NSError *error;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSLog(@"Response status Code : %d",response.statusCode);
isOnline = response.statusCode == 200;
return isOnline;
}
Run Code Online (Sandbox Code Playgroud)
您可以在调度队列中使用该方法,
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(queue, ^{
BOOL status = [self checkConnectionForHost:@"http://google.com"];
NSLog(@"Host status : %@",status ? @"Online" : @"Offline");
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
401 次 |
| 最近记录: |