は私がネイティブに反応のためのネイティブmoduleを持って、それはSafariのビュー・コントローラ開きます「コレクションは列挙されているうちに突然変異されました」というエラーと戦う方法は?
RCTSFSafariViewController.m:
#import "RCTSFSafariViewController.h"
@implementation RCTSFSafariViewController
@synthesize bridge = _bridge;
RCT_EXPORT_MODULE();
- (void)safariViewControllerDidFinish:(SFSafariViewController *)controller {
[self.bridge.eventDispatcher sendAppEventWithName:@"SFSafariViewControllerDismissed" body:nil];
}
RCT_EXPORT_METHOD(openURL:(NSString *)urlString params:(NSDictionary *)params) {
NSURL *url = [[NSURL alloc] initWithString:urlString];
SFSafariViewController *safariViewController = [[SFSafariViewController alloc] initWithURL:url];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:safariViewController];
[navigationController setNavigationBarHidden:YES animated:NO];
safariViewController.delegate = self;
if ([params objectForKey:@"tintColor"]) {
UIColor *tintColor = [RCTConvert UIColor:params[@"tintColor"]];
if([safariViewController respondsToSelector:@selector(setPreferredControlTintColor:)]) {
safariViewController.preferredControlTintColor = tintColor;
} else {
safariViewController.view.tintColor = tintColor;
}
}
dispatch_sync(dispatch_get_main_queue(), ^{
[rootViewController.rootViewController.presentedViewController presentViewController:navigationController animated:YES completion:^{
[self.bridge.eventDispatcher sendDeviceEventWithName:@"SFSafariViewControllerDidLoad" body:nil];
}];
});
}
RCT_EXPORT_METHOD(close) {
dispatch_async(dispatch_get_main_queue(), ^{
UIViewController *rootViewController = [[[UIApplication sharedApplication] delegate] window].rootViewController;
[rootViewController dismissViewControllerAnimated:YES completion:nil];
});
}
@end
RCTSFSafariViewController.h:それはシミュレータと私のiPhoneに適しています
#import <React/RCTBridgeModule.h>
#import <React/RCTConvert.h>
#import <React/RCTEventDispatcher.h>
#import <UIKit/UIKit.h>
@import SafariServices;
@interface RCTSFSafariViewController : NSObject <RCTBridgeModule, SFSafariViewControllerDelegate>
@end
しかし、多くのユーザーがこのようなクラッシュに直面しています(クラッシュスティクスによれば):
Collection <__NSArrayM: 0x14e3bd20> was mutated while being enumerated.' was thrown while invoking openURL on target SFSafariViewController with params ("https://example.com", { })
このコードには配列や列挙型の構造が存在しないという問題があります。 dispatch_asyncによって引き起こされる可能性があるという考えがあります。なぜなら、削除するとアプリケーションがクラッシュするのを止めるからですが、SVCを呼び出した後はゆっくりと動作します。
私は間違っていますか?
私はdispatch_asyncを使い、dispatch_syncは私の絶望的な実験でした。しかし、最後の段落は可能な解決策であるようです。私はそれを試してみます。とにかく、答えに大きな感謝。 – devtwo
どういうわけか、メソッド全体を 'dispatch_async'にラップすると、SFSafariViewControllerを呼び出すときにデッドロックが発生します:( – devtwo
メソッド全体をラップして' dispatch_sync'を削除するか、 'dispatch_sync'を残していますか?' dispatch_sync'コールを削除しないと、 –