工厂模式:不从实现文件中调用iBeacon代理
我在我的信标扫描模块中介绍了“ 工厂模式 ”。 我提到了http://crosbymichael.com/objective-c-design-patterns-factory.html
在我的Factory类中,在接口类“ PCGoogleBeacon.h ”和“ PCAppleBeacon.h ”之间切换了2种信标模式。
// 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"); } }
在我的接口类的实现文件中。
//Header file @protocol PCGetBeacon -(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
//在上面相同的文件中 – 模式2的实现
#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"];
但是为什么没有调用相应类的代理。 ?
注意:信标在范围内。
为PCAppleBeacon
和PCGoogleBeacon
类创建“共享实例”后解决了我的问题。 🙂
说明 :不调用上述类的委托方法,因为实例化了2次。 第一次在’实施工厂类’中实例化,同时设置它的代表。 第二次从类主视图控制器,它的协议未实现,因此接收器失败。