判断网络连接情况

很多情况下会用到这个功能,距离来说现在比较火的微视,有一个功能就是在WiFi环境下自动播放微视,而在3G环境下则需要用户点击才会开始播放.

包括在线音频,视频或者包含大量图片的应用都可以通过这个功能来为用户节省宝贵的流量.

用到的东西就叫做Reachability,可以在https://github.com/tonymillion/Reachability下载完整三方库和文档.

如果想要使用Reachability的话需要引入SystemConfiguration.framework


简单的Demo:

//
//  NESMainViewController.m
//  ReachabilityDemo
//
//  Created by Nestor on 14-3-2.
//  Copyright (c) 2014年 NesTalk. All rights reserved.
//

#import "NESMainViewController.h"
#import "Reachability.h"

@interface NESMainViewController ()

@property (nonatomic,retain) UILabel *lab;

@end

@implementation NESMainViewController

-(void)changeStatus:(NSNotification *)sender
{
    Reachability *reach = sender.object;
    switch (reach.currentReachabilityStatus) {
        case ReachableViaWWAN:
            self.lab.text = @"通过3G连接";
            break;
        case NotReachable:
            self.lab.text = @"没有连接";
            break;
        case ReachableViaWiFi:
            self.lab.text = @"通过WiFi连接";
            break;
    }
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.lab = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 300, 30)];
    [self.view addSubview:self.lab];
    
    Reachability *reach = [Reachability reachabilityWithHostname:@"www.163.com"];
    reach.reachableOnWWAN = NO;
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeStatus:) name:kReachabilityChangedNotification object:nil];
    
    [reach startNotifier];
    
}

@end


这里在屏幕上添加了一个UILabel

    Reachability *reach = [Reachability reachabilityWithHostname:@"www.163.com"];
创建了一个Reachbility对象,参数为需要连接的服务器地址

    reach.reachableOnWWAN = NO;
意思是禁用3G连接

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeStatus:) name:kReachabilityChangedNotification object:nil];
通过通知中心添加了一个监听,在网络连接状态发生改变的时候会调用changeStatus:方法

    switch (reach.currentReachabilityStatus) {
        case ReachableViaWWAN:
            self.lab.text = @"通过3G连接";
            break;
        case NotReachable:
            self.lab.text = @"没有连接";
            break;
        case ReachableViaWiFi:
            self.lab.text = @"通过WiFi连接";
            break;
    }
这里则是针对不同的连接状态进行的对应处理,非常简单~

当然,Reachability还提供了更简单的实现方式,一个block就可以搞定了,如果了解GCD的话会好理解很多,关于GCD的内容这里不展开讨论

    reach.reachableBlock = ^(Reachability *reach){
        dispatch_async(dispatch_get_main_queue(), ^{
            self.lab.text = @"连接可用,通过block修改";
        });
        NSLog(@"连接可用");
    };
    reach.unreachableBlock = ^(Reachability *reach)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
            self.lab.text = @"连接不可用,通过block修改";
        });
        NSLog(@"连接不可用");
    };

通过两个block来指定在连接状态发生改变的时候要执行的操作,需要注意的是,这两个block会在子线程中运行,但是对于UI的修改必须在主线程中完成,所以需要通过GCD回调主线程




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值