目标C:全球可用的方法

时间:2012-08-31 21:00:58

标签: objective-c ios cocoa-touch

我正在使用以下实现来检查是否有可用的互联网连接,并且它工作正常,但因为我要检查互联网连接很多我认为最好(BOOL)可达到的方法是可用的到处都没有重写它。因为我是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

3 个答案:

答案 0 :(得分:3)

使其成为普通的C函数:

BOOL reachable()
{
    // implementation here
}

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

答案 1 :(得分:2)

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

在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];

答案 2 :(得分:2)

Singleton Design Pattern完全符合这种用法

实现单例的最佳方法是创建一个继承NSObject的类,并声明一个sharedInstance类方法,该方法将返回此类的唯一实例,这要归功于GCD dispatch_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