Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS如何将完成块添加到UIWebView loadRequest:?_Ios_Objective C_Asynchronous_Uiwebview_Objective C Blocks - Fatal编程技术网

iOS如何将完成块添加到UIWebView loadRequest:?

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 !=

我正在使用UIWebView,并且已经在使用webViewDidFinishLoad:方法,其中包含一个可选块,该块在加载完成后执行:

    -(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
    完成块

  • 确保它指定了它的委托

  • 实现
    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
//  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");
    }
}];