Skip to content

Commit

Permalink
fix: throw exception when call BKTClient.initalize from a non-main th…
Browse files Browse the repository at this point in the history
…read
  • Loading branch information
duyhungtnn committed Jul 26, 2023
1 parent 62a218d commit 9b92df8
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 37 deletions.
5 changes: 2 additions & 3 deletions Bucketeer/Sources/Public/BKTClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,9 @@ public class BKTClient {
}

extension BKTClient {
public static func initialize(config: BKTConfig, user: BKTUser, timeoutMillis: Int64 = 5000, completion: ((BKTError?) -> Void)? = nil) {
public static func initialize(config: BKTConfig, user: BKTUser, timeoutMillis: Int64 = 5000, completion: ((BKTError?) -> Void)? = nil) throws {
guard (Thread.isMainThread) else {
completion?(BKTError.illegalState(message: "the initialize method must be called on main thread"))
return
throw BKTError.illegalState(message: "the initialize method must be called on main thread")
}
concurrentQueue.sync {
guard BKTClient.default == nil else {
Expand Down
14 changes: 9 additions & 5 deletions BucketeerTests/E2E/E2ETestHelpers.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,16 @@ extension BKTClient {
static func initialize(config: BKTConfig, user: BKTUser, timeoutMillis: Int64 = 5000) async throws {
return try await withCheckedThrowingContinuation { continuation in
DispatchQueue.main.async {
self.initialize(config: config, user: user) { error in
if let error = error {
continuation.resume(throwing: error)
} else {
continuation.resume(returning: ())
do {
try self.initialize(config: config, user: user) { error in
if let error = error {
continuation.resume(throwing: error)
} else {
continuation.resume(returning: ())
}
}
} catch {
continuation.resume(throwing: error)
}
}
}
Expand Down
63 changes: 35 additions & 28 deletions Example/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,38 +14,45 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
.with(attributes: [:])
.build()

BKTClient.initialize(
config: self.makeConfigUsingBuilder(),
user: user
) { error in
if let error {
print(error)
}
var client : BKTClient?
do {
try client = BKTClient.shared
} catch {
print(error.localizedDescription)
}
client?.updateUserAttributes(attributes: [:])
print("intVariation =", client?.intVariation(featureId: "feature-ios-e2e-integer", defaultValue: 0) ?? 0)
print("doubleVariation =", client?.doubleVariation(featureId: "feature-ios-e2e-double", defaultValue: 0.0) ?? 0.0)
print("boolVariation =", client?.boolVariation(featureId: "feature-ios-e2e-bool", defaultValue: false) ?? false)
print("stringVariation =", client?.stringVariation(featureId: "feature-ios-e2e-string", defaultValue: "004 not found...") ?? "004 not found...")
print("jsonVariation =", client?.jsonVariation(featureId: "feature-ios-e2e-json", defaultValue: [:]) ?? [:])
DispatchQueue.main.async {
self.setSingleViewController()
}

DispatchQueue.main.async {
let isTabMode = client?.boolVariation(featureId: "ios_test_001", defaultValue: false) ?? false
if isTabMode {
self.setTabBarController()
} else {
do {
try BKTClient.initialize(
config: self.makeConfigUsingBuilder(),
user: user
) { error in
if let error {
print(error)
}
var client : BKTClient?
do {
try client = BKTClient.shared
} catch {
print(error.localizedDescription)
}
client?.updateUserAttributes(attributes: [:])
print("intVariation =", client?.intVariation(featureId: "feature-ios-e2e-integer", defaultValue: 0) ?? 0)
print("doubleVariation =", client?.doubleVariation(featureId: "feature-ios-e2e-double", defaultValue: 0.0) ?? 0.0)
print("boolVariation =", client?.boolVariation(featureId: "feature-ios-e2e-bool", defaultValue: false) ?? false)
print("stringVariation =", client?.stringVariation(featureId: "feature-ios-e2e-string", defaultValue: "004 not found...") ?? "004 not found...")
print("jsonVariation =", client?.jsonVariation(featureId: "feature-ios-e2e-json", defaultValue: [:]) ?? [:])
DispatchQueue.main.async {
self.setSingleViewController()
}

DispatchQueue.main.async {
let isTabMode = client?.boolVariation(featureId: "ios_test_001", defaultValue: false) ?? false
if isTabMode {
self.setTabBarController()
} else {
self.setSingleViewController()
}
}
}
} catch {
// Handle exception when initialize the BKTClient,
// Usually because it required to call from the main thread
print(error.localizedDescription)
}


return true
}
Expand Down
2 changes: 1 addition & 1 deletion Example/FirstViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class FirstViewController: UIViewController {
do {
try client = BKTClient.shared
} catch {
// We may have an error when we did not initialize the client
// We may have an error when we did not success initialize the client
// Handle error
}
}
Expand Down

0 comments on commit 9b92df8

Please sign in to comment.