iOS如何将完成块添加到UIWebView loadRequest:?
我正在使用UIWebView,并且已经在使用webViewDidFinishLoad:方法,其中包含一个可选块,该块在加载完成后执行:iOS如何将完成块添加到UIWebView loadRequest:?,ios,objective-c,asynchronous,uiwebview,objective-c-blocks,Ios,Objective C,Asynchronous,Uiwebview,Objective C Blocks,我正在使用UIWebView,并且已经在使用webViewDidFinishLoad:方法,其中包含一个可选块,该块在加载完成后执行: -(void)webViewDidFinishLoad:(UIWebView *)webView { [super webViewDidFinishLoad:webView]; //... bunch of other code if(self.webViewFinishLoadBlock !=
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
[super webViewDidFinishLoad:webView];
//... bunch of other code
if(self.webViewFinishLoadBlock != nil)
{
self.webViewFinishLoadBlock();
}
}
现在我正在处理一个更复杂的加载页面和重定向序列,这使得上面的逻辑不够。我不想将自己注册为dummyWebView的代理,必须处理存储在我的视图控制器属性中的多个完成块:
dummyWebView = [[UIWebView alloc] initWithFrame:CGRectZero];
[dummyWebView loadRequest:[NSURLRequest requestWithURL:logoutURL]];
//Ideally here I would know when dummyWebView finishes loading, because there's some code I want to execute once it is done
我的问题是:
是否有某种第三方框架允许我使用loadRequest:withCompletion:
来简化回调代码的编写?
- (void)webViewDidFinishLoad:(UIWebView *)webView
是一个委托方法。按照约定,委托方法要求对象将自身传递回委托:
(UIWebView*)webView
通过一个参数
如果我们想使用属性request:
获取最后一个请求参数,这意味着webView.request.URL
父对象可以是多个对象的委托,并且它可以通过该参数识别从哪个对象获得响应。要么打开响应您的内容,要么构建一些基础设施以更优雅地处理它。您可以:
- 子类
,其属性用于保存UIWebView
完成块webViewDidFinish
- 确保它指定了它的委托
- 实现
就像您编写的那样(尽管我建议块同时返回web视图和webViewDidFinish
对象,如果有的话);及NSError
- 也实现
webView:didFailLoadWithError:
// MyWebView.h
#import <UIKit/UIKit.h>
typedef void(^WebViewFinishLoadBlock)(UIWebView *, NSError *);
@interface MyWebView : UIWebView
@property(nonatomic, copy) WebViewFinishLoadBlock webViewFinishLoadBlock;
- (void)loadRequest:(NSURLRequest *)request withCompletionHandler:(WebViewFinishLoadBlock)completionHandler;
@end
// MyWebView.m
#import "MyWebView.h"
@interface MyWebView () <UIWebViewDelegate>
@end
@implementation MyWebView
- (void)loadRequest:(NSURLRequest *)request withCompletionHandler:(WebViewFinishLoadBlock)completionHandler
{
self.delegate = self;
self.webViewFinishLoadBlock = completionHandler;
[self loadRequest:request];
}
#pragma mark - UIWebViewDelegate
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
if (self.webViewFinishLoadBlock) {
self.webViewFinishLoadBlock(webView, nil);
self.webViewFinishLoadBlock = nil;
}
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
if (self.webViewFinishLoadBlock) {
self.webViewFinishLoadBlock(webView, error);
self.webViewFinishLoadBlock = nil;
}
}
@end
MyWebView *webView = [[MyWebView alloc] init];
webView.frame = self.view.bounds;
[self.view addSubview:webView];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request withCompletionHandler:^(UIWebView *webView, NSError *error) {
if (error) {
NSLog(@"failed: %@", error);
} else {
NSLog(@"succeeded");
}
}];