0

我正在使用以下实现来检查是否有可用的互联网连接,并且它工作正常,但是因为我要经常检查互联网连接,我认为最好让 (BOOL)reachable 方法在任何地方都可用而无需重写它每次。因为我是 iOS 开发的新手,所以我不知道该怎么做。最好的方法是什么?

//
// SigninViewController.m
//

#import "Reachability.h"
#import "SigninViewController.h"

@implementation SigninViewController

...

- (IBAction)SigninTouchUpInside:(id)sender
{

    if ([self reachable])
    {
        NSLog(@"Reachable");
    }
    else
    {
        NSLog(@"Not Reachable");
    }

}

- (BOOL)reachable {
    Reachability *reachability = [Reachability reachabilityWithHostName:@"enbr.co.cc"];
    NetworkStatus internetStatus = [reachability currentReachabilityStatus];
    if(internetStatus == NotReachable) {
        return NO;
    }
    return YES;
}

@end
4

3 回答 3

3

使它成为一个普通的 C 函数:

BOOL reachable()
{
    // implementation here
}

在单独的头文件中声明它并独立于任何其他类实现它,因此可以在任何地方使用它。

于 2012-08-31T21:13:46.630 回答
2

您可以将其作为您的应用程序委托类的方法。由于该方法不需要访问任何类属性,因此它可以是类方法(用“+”声明)而不是实例方法(用“-”声明)。

在 yourAppDelegate.h 中:

+ (BOOL)reachable;

在 yourAppDelegate.m 中:

+ (BOOL)reachable {
    Reachability *reachability = [Reachability reachabilityWithHostName:@"enbr.co.cc"];
    NetworkStatus internetStatus = [reachability currentReachabilityStatus];
    return (internetStatus == NotReachable);
}

调用方法:

#import "yourAppDelegate.h"
...
BOOL reachable = [YourAppDelegate reachable];
于 2012-08-31T21:13:05.313 回答
2

例设计模式正是针对这种用途

实现单例的最佳方法是创建一个继承 NSObject 的类并声明一个sharedInstance类方法,该方法将通过 GCDdispatch_once函数返回该类的唯一实例(这样调用sharedInstance只会在第一次分配对象,总是返回进一步调用相同的对象/实例)

@interface ReachabilityService : NSObject
+ (id)sharedInstance;
@property(nonatomic, readonly) BOOL networkIsReachable;
@end


@implementation ReachabilityService
+ (id)sharedInstance
{
    static dispatch_once_t pred;
    static ReachabilityService *sharedInstance = nil;

    dispatch_once(&pred, ^{ sharedInstance = [[self alloc] init]; });
    return sharedInstance;
}
- (BOOL)networkIsReachable
{
    Reachability *reachability = [Reachability reachabilityWithHostName:@"enbr.co.cc"];
    NetworkStatus internetStatus = [reachability currentReachabilityStatus];
    return (internetStatus != NotReachable);
}
@end

另一种方法是直接将您的方法声明为类方法,因为它不会使用任何实例变量或属性。那就是直接声明+ (BOOL)networkIsReachable而不是声明- (BOOL)networkIsReachable,并避免使用单例模式和sharedInstance方法本身。

@interface ReachabilityService : NSObject
+ (BOOL)networkIsReachable;
@end

@implementation ReachabilityService
+ (BOOL)networkIsReachable
{
    Reachability *reachability = [Reachability reachabilityWithHostName:@"enbr.co.cc"];
    NetworkStatus internetStatus = [reachability currentReachabilityStatus];
    return (internetStatus != NotReachable);
}
@end
于 2012-08-31T21:13:22.147 回答