工厂模式:不从实现文件中调用 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没有被调用。 ?
注意:信标在范围内。
在为 PCAppleBeacon
和 PCGoogleBeacon
创建 "Shared Instance" 之后 class 解决了我的问题。 :-)
说明:
上面 classes 的委托方法没有被调用,因为它们被实例化了 2 倍。第一次在 'Implementation of Factory Class' 中实例化并设置它的委托。第二次来自 class 主视图控制器,它的协议未实现,因此接收器失败。
我在信标扫描模块中引入了“工厂模式”。我提到了 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没有被调用。 ?
注意:信标在范围内。
在为 PCAppleBeacon
和 PCGoogleBeacon
创建 "Shared Instance" 之后 class 解决了我的问题。 :-)
说明: 上面 classes 的委托方法没有被调用,因为它们被实例化了 2 倍。第一次在 'Implementation of Factory Class' 中实例化并设置它的委托。第二次来自 class 主视图控制器,它的协议未实现,因此接收器失败。