little-snow-fox / react-native-wechat-lib

🚀 WeChat login, share, favorite and payment for React-Native on iOS and Android
MIT License
653 stars 127 forks source link

使用[NSData dataWithContentsOfURL:url]请求会卡主线程 #188

Closed xclidongbo closed 2 years ago

xclidongbo commented 2 years ago
- (UIImage *) getImageFromURL:(NSString *)fileURL {
    UIImage * result;
    NSURL * url = [NSURL URLWithString:fileURL];
    NSData * data = [NSData dataWithContentsOfURL:url];
    result = [UIImage imageWithData:data];
    return result;
}

改为:

- (void)getImageFromURL:(NSString *)fileURL complection:(void(^)(UIImage *image))complection {
    if (!fileURL && complection) complection(nil);
    NSURL * url = [NSURL URLWithString:fileURL];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//        NSLog(@"%@", data);
        if (error) complection(nil);
        UIImage *img = [UIImage imageWithData:data];
        if (complection) complection(img);
    }];
    [dataTask resume];
}
xclidongbo commented 2 years ago

或者使用GCD, 在原有基础上改改也可以实现.

xclidongbo commented 2 years ago
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        WXWebpageObject *webpageObject = [WXWebpageObject object];
        webpageObject.webpageUrl = data[@"webpageUrl"];
        WXMediaMessage *message = [WXMediaMessage message];
        message.title = data[@"title"];
        message.description = data[@"description"];
        NSString *thumbImageUrl = data[@"thumbImageUrl"];
        if (thumbImageUrl != NULL && ![thumbImageUrl isEqual:@""]) {
            UIImage *image = [self getImageFromURL:thumbImageUrl];
            message.thumbData = [self compressImage: image toByte:32678];
        }
        message.mediaObject = webpageObject;
        SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
        req.bText = NO;
        req.message = message;
        req.scene = [data[@"scene"] intValue];
        dispatch_async(dispatch_get_main_queue(), ^{
            void ( ^ completion )( BOOL );
            completion = ^( BOOL success )
            {
                callback(@[success ? [NSNull null] : INVOKE_FAILED]);
                return;
            };
            [WXApi sendReq:req completion:completion];
        });
    });
xclidongbo commented 2 years ago

很不错的组件.