mirror of
https://github.com/Tencent/Hippy.git
synced 2026-10-29 06:06:52 +08:00
fix(ios): improve stability
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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_);
|
||||
|
||||
@@ -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_;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user