工厂模式:不从实现文件中调用 iBeacon 委托

Factory pattern : iBeacon Delegates are not called from implemention file

我在信标扫描模块中引入了“工厂模式”。我提到了 http://crosbymichael.com/objective-c-design-patterns-factory.html

在我的工厂class中,2种信标模式在界面classes“PCGoogleBeacon.h”和“[=38”之间切换=]PCAppleBeacon.h”.

//Factory的头文件

typedef enum beaconMode {
    iBeacon,
    Eddystone
} BeaconMode;

@interface PCBeaconFinder : NSObject

+(id) searchForBeaconMode:(BeaconMode) beaconMode;

@end

//工厂的实现

+(id) searchForBeaconMode:(BeaconMode) beaconMode
{

    switch (beaconMode ) {

        case iBeacon:

            return   [PCAppleBeacon new];

            break;

        case Eddystone:

            return   [PCGoogleBeacon new];

            break;

        default: NSLog(@"UNKOWN BEACON MODE");


    }

}

在我的接口实现文件中 classes.

//Header file

@protocol PCGetBeacon <NSObject>

-(void) scanBeaconsWithUUID:(NSString *) beaconId;

@end

//在实现文件中。 — 模式 1 的实施

#import "PCAppleBeacon.h"

@implementation PCAppleBeacon

-(void) scanBeaconsWithUUID:(NSString *) beaconId {


    self.proximityContentManager = [[ProximityContentManager alloc]
                                    initWithBeaconIDs:@[

                                                        [[BeaconID alloc] initWithUUIDString:beaconId major:0 minor:0]
                                                        ]
                                    beaconContentFactory:[EstimoteCloudBeaconDetailsFactory new]];

    self.proximityContentManager.delegate = self;

    [self.proximityContentManager startContentUpdates];


    NSLog(@"----------- > iBeacon  Implementation Called ");


}

//iBeacon Delegates goes here …


@end

// 在同一个文件中——方式二的实现

#import "PCGoogleBeacon.h"

@implementation PCGoogleBeacon

-(void) scanBeaconsWithUUID:(NSString *) beaconId {

    _scanner.delegate = self;

    [_scanner startScanning];

    NSLog(@"----------- > EDDYSTONE  Implementation Called ");

}

//EDDYSTONE Delegates goes here …

@end

一切都很好。可以从 MainController 切换,

 id beaconFinderObject =   [PCBeaconFinder searchForBeaconMode:iBeacon];  //or ‘Eddystone’ for Google beacon interface.

 [beaconFinderObject scanBeaconsWithUUID:@"B0702880-A295-A8AB-F734-031A98A512DE"];

但是为什么对应的classes的delegates没有被调用。 ?

注意:信标在范围内。

在为 PCAppleBeaconPCGoogleBeacon 创建 "Shared Instance" 之后 class 解决了我的问题。 :-)

说明: 上面 classes 的委托方法没有被调用,因为它们被实例化了 2 倍。第一次在 'Implementation of Factory Class' 中实例化并设置它的委托。第二次来自 class 主视图控制器,它的协议未实现,因此接收器失败。