fix(ios): improve stability

This commit is contained in:
mengyanluo
2021-03-25 11:03:03 +08:00
committed by luomy
parent 74c60c1e42
commit ce8809e73b
3 changed files with 12 additions and 25 deletions
+2 -20
View File
@@ -76,15 +76,6 @@ struct RandomAccessBundleData {
: bundle(nullptr, fclose) { }
};
static NSHashTable<HippyBridge *> *weakBridgeHashTable() {
static dispatch_once_t onceToken;
static NSHashTable<HippyBridge *> *weakBridgeHashTable = nil;
dispatch_once(&onceToken, ^{
weakBridgeHashTable = [NSHashTable weakObjectsHashTable];
});
return weakBridgeHashTable;
}
static bool defaultDynamicLoadAction(const std::string& uri, std::function<void(std::string)> cb) {
NSString *URIString = [NSString stringWithUTF8String:uri.c_str()];
NSURL *url = HippyURLWithString(URIString, NULL);
@@ -101,16 +92,8 @@ static bool defaultDynamicLoadAction(const std::string& uri, std::function<void(
return true;
}
static bool loadFunc(const std::string& uri, std::function<void(std::string)> cb, void *userData) {
HippyBridge *strongBridge = nil;
for (HippyBridge *bridge in weakBridgeHashTable()) {
void *bridgePointer = (__bridge void *)bridge;
if (bridgePointer == userData) {
strongBridge = bridge;
break;
}
}
static bool loadFunc(const std::string& uri, std::function<void(std::string)> cb, CFTypeRef userData) {
HippyBridge *strongBridge = (__bridge_transfer HippyBridge *)userData;
if ([strongBridge.delegate respondsToSelector:@selector(dynamicLoad:URI:completion:)]) {
NSString *URIString = [NSString stringWithUTF8String:uri.c_str()];
BOOL delegateCallRet = [strongBridge.delegate dynamicLoad:strongBridge URI:URIString completion:^(NSString *retString) {
@@ -165,7 +148,6 @@ HIPPY_EXPORT_MODULE()
}
- (void)initURILoader {
[weakBridgeHashTable() addObject:_bridge];
std::shared_ptr<IOSLoader> loader = std::make_shared<IOSLoader>(loadFunc, (__bridge void *)_bridge);
self.pScope->SetUriLoader(loader);
}
+6 -1
View File
@@ -25,7 +25,12 @@
#include "core/core.h"
IOSLoader::IOSLoader(RequestUntrustedContentPtr loader, void *userData): loader_(loader), userData_(userData) {}
IOSLoader::IOSLoader(RequestUntrustedContentPtr loader, CFTypeRef userData): loader_(loader), userData_(CFRetain(userData)) {}
IOSLoader::~IOSLoader() {
CFRelease(userData_);
userData_ = nullptr;
}
bool IOSLoader::RequestUntrustedContent(const std::string& uri, std::function<void(std::string)> cb) {
return loader_(uri, cb, userData_);
+4 -4
View File
@@ -24,13 +24,13 @@
#include "core/core.h"
typedef bool (*RequestUntrustedContentPtr)(const std::string& uri, std::function<void(std::string)> cb, void *userData);
typedef bool (*RequestUntrustedContentPtr)(const std::string& uri, std::function<void(std::string)> cb, CFTypeRef userData);
class IOSLoader : public hippy::base::UriLoader {
public:
IOSLoader(RequestUntrustedContentPtr loader, void *userData);
IOSLoader(RequestUntrustedContentPtr loader, CFTypeRef userData);
virtual ~IOSLoader() {}
virtual ~IOSLoader();
virtual bool RequestUntrustedContent(const std::string& uri, std::function<void(std::string)> cb);
@@ -40,5 +40,5 @@ class IOSLoader : public hippy::base::UriLoader {
private:
RequestUntrustedContentPtr loader_;
void *userData_;
CFTypeRef userData_;
};