Ale*_*one 2 asynchronous objective-c uiwebview ios objective-c-blocks
我正在使用UIWebView,并且我已经在使用带有可选块的webViewDidFinishLoad:方法,该块在加载完成后执行:
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
[super webViewDidFinishLoad:webView];
//... bunch of other code
if(self.webViewFinishLoadBlock != nil)
{
self.webViewFinishLoadBlock();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我正在使用更复杂的加载页面和重定向序列,这使得上面的逻辑不够充分.我不想将自己注册为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
Run Code Online (Sandbox Code Playgroud)
我的问题是:
是否有某种第三方框架可以让我loadRequest:withCompletion:用来简化编写回调代码?
你可以:
UIWebView具有保存webViewDidFinish完成块的属性的子类;
确保它指定了其委托;
实现webViewDidFinish就像你写的那样(虽然我建议块返回web视图和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
Run Code Online (Sandbox Code Playgroud)
和
// 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
Run Code Online (Sandbox Code Playgroud)
然后:
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");
}
}];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3742 次 |
| 最近记录: |