From f6831e837a650064b68424c82b6264b2c3fc005f Mon Sep 17 00:00:00 2001 From: 0xd-cc Date: Wed, 15 Jan 2020 03:56:16 -0800 Subject: [PATCH] iOS/Sample : UI need to be updated on Main Thread (#740) Summary: ### iOSSample: Fix iOS Sample App crash: UI need to be updated on Main Thread ### SampleSwift: * Upgrade swift version * Fix force unwrapping * UI need to be updated on Main Thread ## Changelog Pull Request resolved: https://github.com/facebook/flipper/pull/740 Differential Revision: D19397414 Pulled By: passy fbshipit-source-id: 7af84c0fe43861aff6a18c36bf81a940baec5147 --- iOS/Sample/NetworkViewController.m | 18 ++++++++++-------- .../SampleSwift.xcodeproj/project.pbxproj | 4 ++-- iOS/SampleSwift/SampleSwift/AppDelegate.swift | 2 +- .../SampleSwift/NetworkViewController.swift | 18 ++++++++++-------- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/iOS/Sample/NetworkViewController.m b/iOS/Sample/NetworkViewController.m index 6736dbf1c..263f079e3 100644 --- a/iOS/Sample/NetworkViewController.m +++ b/iOS/Sample/NetworkViewController.m @@ -44,15 +44,13 @@ [[[NSURLSession sharedSession] dataTaskWithRequest:urlRequest completionHandler:^(NSData *_Nullable data, NSURLResponse *_Nullable response, NSError *_Nullable dataTaskError) { if (dataTaskError || !data) { - UIAlertController *alertController = [weakSelf alertControllerForMessage:@"Received error in POST API response"]; - [weakSelf presentViewController:alertController animated:true completion:nil]; + [weakSelf showAlertWithMessage:@"Received error in POST API response"]; return; } NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&dataTaskError]; NSLog(@"MSG-POST: %@", dict[@"msg"]); - UIAlertController *alertController = [weakSelf alertControllerForMessage:@"Received response from POST API"]; - [weakSelf presentViewController:alertController animated:true completion:nil]; + [weakSelf showAlertWithMessage:@"Received response from POST API"]; }] resume]; } @@ -61,17 +59,21 @@ __weak NetworkViewController *weakSelf = self; [[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:@"https://demo9512366.mockable.io/FlipperGet"] completionHandler:^(NSData *_Nullable data, NSURLResponse *_Nullable response, NSError *_Nullable error) { if (error || !data) { - UIAlertController *alertController = [weakSelf alertControllerForMessage:@"Received error in GET API response"]; - [weakSelf presentViewController:alertController animated:true completion:nil]; + [weakSelf showAlertWithMessage:@"Received error in GET API response"]; return; } NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; NSLog(@"MSG-GET: %@", dict[@"msg"]); - UIAlertController *alertController = [weakSelf alertControllerForMessage:@"Received response from GET API"]; - [weakSelf presentViewController:alertController animated:true completion:nil]; + [weakSelf showAlertWithMessage:@"Received response from GET API"]; }] resume]; } +- (void)showAlertWithMessage:(nonnull NSString *)msg { + dispatch_async(dispatch_get_main_queue(), ^{ + UIAlertController *alertController = [self alertControllerForMessage:msg]; + [self presentViewController:alertController animated:true completion:nil]; + }); +} - (UIAlertController *)alertControllerForMessage:(nonnull NSString *)msg { UIAlertController *controller = [UIAlertController alertControllerWithTitle:@"Flipper" message:msg preferredStyle:UIAlertControllerStyleAlert]; diff --git a/iOS/SampleSwift/SampleSwift.xcodeproj/project.pbxproj b/iOS/SampleSwift/SampleSwift.xcodeproj/project.pbxproj index fb76eb4b4..2728c4d5c 100644 --- a/iOS/SampleSwift/SampleSwift.xcodeproj/project.pbxproj +++ b/iOS/SampleSwift/SampleSwift.xcodeproj/project.pbxproj @@ -373,7 +373,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.facebook.flipper.SampleSwift; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -424,7 +424,7 @@ OTHER_SWIFT_FLAGS = "$(inherited) -Xcc -fmodule-map-file=\"${PODS_ROOT}/Headers/Public/FlipperKit/FlipperKit.modulemap\" -Xcc -DFB_SONARKIT_ENABLED"; PRODUCT_BUNDLE_IDENTIFIER = com.facebook.flipper.SampleSwift; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/iOS/SampleSwift/SampleSwift/AppDelegate.swift b/iOS/SampleSwift/SampleSwift/AppDelegate.swift index 50413e62f..219b1fc5e 100644 --- a/iOS/SampleSwift/SampleSwift/AppDelegate.swift +++ b/iOS/SampleSwift/SampleSwift/AppDelegate.swift @@ -14,7 +14,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { window = UIWindow() let client = FlipperClient.shared() diff --git a/iOS/SampleSwift/SampleSwift/NetworkViewController.swift b/iOS/SampleSwift/SampleSwift/NetworkViewController.swift index 03ab6b004..d9627e63a 100644 --- a/iOS/SampleSwift/SampleSwift/NetworkViewController.swift +++ b/iOS/SampleSwift/SampleSwift/NetworkViewController.swift @@ -23,9 +23,9 @@ class NetworkViewController: UIViewController { return } - let dict = try! JSONSerialization.jsonObject(with: dataUnwrapped, options: JSONSerialization.ReadingOptions.init(rawValue: 0)) as! [String: String] + let dict = try? JSONSerialization.jsonObject(with: dataUnwrapped, options: JSONSerialization.ReadingOptions.init(rawValue: 0)) as? [String: String] // As sonar cannot detect print() in Logs - NSLog("MSG-GET: \(dict["msg"] ?? "Did not find msg key in the received response")") + NSLog("MSG-GET: \(dict?["msg"] ?? "Did not find msg key in the received response")") strongSelf.showAlert(message: "Received response from GET API, please check the sonar network plugin for detailed response") } dataTask.resume() @@ -55,9 +55,9 @@ class NetworkViewController: UIViewController { return } - let dict = try! JSONSerialization.jsonObject(with: dataUnwrapped, options: JSONSerialization.ReadingOptions.init(rawValue: 0)) as! [String: String] + let dict = try? JSONSerialization.jsonObject(with: dataUnwrapped, options: JSONSerialization.ReadingOptions.init(rawValue: 0)) as? [String: String] // As sonar cannot detect print() in Logs - NSLog("MSG-POST: \(dict["msg"] ?? "Did not find msg key in the received response")") + NSLog("MSG-POST: \(dict?["msg"] ?? "Did not find msg key in the received response")") strongSelf.showAlert(message: "Received response from POST API, please check the sonar network plugin for detailed response") } dataTask.resume() @@ -85,9 +85,11 @@ class NetworkViewController: UIViewController { } func showAlert(message: String) { - let alertController = UIAlertController.init(title: "Flipper", message: message, preferredStyle: .alert); - let alertAction = UIAlertAction(title: "Okay", style: UIAlertActionStyle.default, handler: nil) - alertController.addAction(alertAction) - present(alertController, animated: true, completion: nil) + DispatchQueue.main.async { + let alertController = UIAlertController.init(title: "Flipper", message: message, preferredStyle: .alert); + let alertAction = UIAlertAction(title: "Okay", style: UIAlertAction.Style.default, handler: nil) + alertController.addAction(alertAction) + self.present(alertController, animated: true, completion: nil) + } } }