Objective c 目标C:全球可用的方法

Objective c 目标C:全球可用的方法,objective-c,ios,cocoa-touch,Objective C,Ios,Cocoa Touch,我使用下面的实现来检查是否有可用的internet连接,并且工作正常,但是因为我要经常检查internet连接,所以我认为最好是(BOOL)可访问的方法在任何地方都可用,而不必每次重写它。因为我是iOS开发新手,我不知道该怎么做。最好的方法是什么 // // SigninViewController.m // #import "Reachability.h" #import "SigninViewController.h" @implementation SigninViewControll

我使用下面的实现来检查是否有可用的internet连接,并且工作正常,但是因为我要经常检查internet连接,所以我认为最好是(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

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

在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];
这本书正是为那种用法而写的

实现单例的最佳方法是创建一个继承NSObject的类,并声明一个
sharedInstance
class方法,该方法将通过GCD
dispatch\u once
函数返回该类的唯一实例(这样调用
sharedInstance
将仅在第一次分配对象,在进一步调用时始终返回相同的对象/实例)


另一种方法是直接将方法声明为类方法,因为它不会使用任何实例变量或属性。这就是直接声明
+(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

使其成为普通的C函数:

BOOL reachable()
{
    // implementation here
}

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

另一种方法是将它捆绑到一个类中,该类将封装网络堆栈的细节。编辑:另一个优点是现在您有了一个对象来处理可达性状态更改通知,并根据需要处理/传递它们。我编辑了我的答案,提出了一种替代方法,使其成为类方法,因为在这种情况下,singleton没有任何ivar或属性要处理。但我仍然更喜欢单例方法和“服务”模型,因为您可以在其中添加很多内容(如按照您的建议处理可达性更改通知)。我完全同意将其放入App Delegate是一个糟糕的概念选择。我想否决它的人认为使用AppDelegate进行此操作不是最佳实践,因为AppDelegate不是为此而设计的,而是为应用程序事件委派而设计的。为此类目的创建一个专用的单例通常是更好的设计(AppDelegate在设计上是单例的,因为它是UIApplication的委托,UIApplication本身是单例的,但为每个功能创建一个专用类更符合逻辑),或者将函数放在专用的“utility.h/.m”文件或类似文件中(即使将此代码放在AppDelegate中显然也会起作用)。
BOOL reachable()
{
    // implementation here
}