Skip to content

Instantly share code, notes, and snippets.

@quintonpryce
Last active July 18, 2019 19:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save quintonpryce/b81e1c63f93fd3af64f6e3b12f213b3a to your computer and use it in GitHub Desktop.
Save quintonpryce/b81e1c63f93fd3af64f6e3b12f213b3a to your computer and use it in GitHub Desktop.
Analytics Core
open class Analytics: AnalyticsScope {
public static let shared: AnalyticsScope = Analytics()
private var eventTrackers: [EventTrackerKey: EventTracker] = [:]
private let failureHandler: FailureHandler
public init() {
failureHandler = SimpleFailureHandler()
}
public init(failureHandler: FailureHandler) {
self.failureHandler = failureHandler
}
public func track(event: AnalyticsEvent) {
trackAnalytic(event: event, parameters: EmptyParameter())
}
public func track<T>(event: AnalyticsEvent, with parameters: T) where T : AnalyticsParameter {
trackAnalytic(event: event, parameters: parameters)
}
public func addEventTracker(key: EventTrackerKey, tracker: EventTracker) {
DispatchQueue(label: "com.test.mySerialQueue").sync {
eventTrackers[key] = tracker
}
}
private func trackAnalytic<T: AnalyticsParameter>(event: AnalyticsEvent, parameters: T?) {
if event.supportedTrackers.isEmpty {
failureHandler.failure("Event \(event.name) does not have any supported EventTrackers.")
return
}
for trackerKey in event.supportedTrackers {
if let eventTracker = eventTrackers[trackerKey] {
if eventTracker.isEventNameSupported(event: event.name) {
if let parameters = parameters, !parameters.isEmpty() {
eventTracker.track(event: event.name, with: parameters)
} else {
eventTracker.track(event: event.name)
}
} else {
failureHandler.failure("Event \(event.name) is not a supported event by the EventTracker \(trackerKey.name).")
}
} else {
failureHandler.failure("Event \(event.name) supported tracker \(trackerKey.name) has not been added to Analytics. " +
"To fix this you must call Analytics.shared.addEventTracker(key: \(trackerKey.name), tracker: \(trackerKey.name)Tracker()" +
"before tracking an event that is supported by that EventTracker.")
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment