*)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler :(void (^)(NSURLRequest * _Nullable))completionHandler方法如下: - (void)URLSession:(NSURLSession *)session *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler :(void (^)(NSURLRequest * _Nullable))completionHandler { // Identify the operation that runs :completionHandler]; } else { if (completionHandler) { completionHandler(customRequest
= nil){ VMXMLParser().initWithURL(url, completionHandler: completionHandler) = nil){ VMXMLParser().initWithURLString(urlString, completionHandler: completionHandler = nil){ VMXMLParser().initWithContentsOfData(data, completionHandler:completionHandler = nil) -> AnyObject { parseXMLForUrl(url :url, completionHandler: completionHandler) parseXMLForUrl(url :url, completionHandler: completionHandler) return self }
*)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler :(void (^)(NSURLRequest *))completionHandler 首先看一下系统的API接口 /* An HTTP request is attempting to perform :(void (^)(NSURLRequest * _Nullable))completionHandler; 下面看一下AFN中该代理方法的实现 - (void)URLSession:(NSURLSession :(void (^)(NSURLRequest *))completionHandler { NSURLRequest *redirectRequest = request; if ( 接着就是利用生成的request重新请求 if (completionHandler) { completionHandler(redirectRequest); } 这个方法是在服务器去重定向的时候
:completionHandler]; return dataTask; } 5. :(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler { __block :completionHandler]; return downloadTask; } 其中self.session是AFURLSessionManager.h中的属性 @property ( [self dataTaskWithRequest:request uploadProgress:nil downloadProgress:nil completionHandler:completionHandler :completionHandler]; return dataTask; } 6.
webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler :(void (^)(void))completionHandler { UIAlertController * alertController = [UIAlertController alertControllerWithTitle webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler :(void (^)(BOOL))completionHandler { UIAlertController *alertController = [UIAlertController alertControllerWithTitle :(void (^)(NSString * _Nullable))completionHandler { UIAlertController * alertController = [
苹果在iOS 10 中已经弃用了openURL:这个旧方法,用openURL:options:completionHandler:来代替。 支付宝等) iOS 10 中的更新 苹果在UIKit相关的 What’s New in iOS 文档中提到: The new UIApplication method openURL:options:completionHandler 翻译如下: 新的UIApplication 方法`openURL:options:completionHandler:` 会异步执行,并在主队列中调用这个指定的 `completion handler` :nil]; // Swift UIApplication.shared.open(url, options: [:], completionHandler: nil) 实际上,只要你仍需要支持iOS :)]) { [application openURL:URL options:@{} completionHandler:^(BOOL success) { NSLog
:(NSURLRequest*)requestcompletionHandler:(void(^)(NSData*data,NSURLResponse*response,NSError*error))completionHandler :(void(^)(NSURLSessionResponseDisposition disposition))completionHandler { _urlResponse= response; // : (void (^)(NSCachedURLResponse *_Nullable)) completionHandler { completionHandler(proposedResponse); :(void (^)(NSURLRequest*))completionHandler { NSMutableURLRequest*redirectRequest; redirectRequest = :(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler{ NSLog
, completionHandler: CompletionHandler?) , completionHandler: CompletionHandler?) 第四个参数类型CompletionHandler也一样是个闭包类型的别名: public typealias CompletionHandler = ((image: UIImage? , completionHandler: CompletionHandler?) , completionHandler: CompletionHandler?
*)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler :(void (^)(NSURLSessionResponseDisposition disposition))completionHandler; 首先看一下苹果该方法的API /* The task :(void (^)(NSURLSessionResponseDisposition disposition))completionHandler; 看一下AFN中该方法的实现 - (void)URLSession ) { completionHandler(disposition); } } 这里,NSURLSessionResponseDisposition disposition = :(void (^)(NSCachedURLResponse * _Nullable cachedResponse))completionHandler; 首先看一下苹果该方法的API /* Invoke
:(void (^)(NSError * _Nullable))completionHandler { [self addObserver:self forKeyPath: :completionHandler]; } /////////////////////////////////停止隧道///////////////////////////////////////// ///////// - (void)stopTunnelWithReason:(NEProviderStopReason)reason completionHandler:(void (^)(void) if (error) { if (completionHandler) { completionHandler(error); } } else { if (completionHandler) { completionHandler(nil);
3.在原生得到结果后,需要回调给JS,通过completionHandler 回调给JS 4.completionHandler 回调的参数和返回值都是空 /** 下面这三个方法根据前面的字面意思就能区分记住 // 在原生得到结果后,需要回调给JS,通过completionHandler 回调给JS // completionHandler 回调的参数和返回值都是空 -(void)webView:(WKWebView 回调给JS 4.大家注意这个回调的completionHandler参数是字符串 // runJavaScriptTextInput // 要求用户输入一段文本 // 在原生输入得到文本内容后,通过 completionHandler回调给JS 大家注意这个回调的completionHandler参数是字符串 -(void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt :(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler
- (void)fetchPatchInfo:(NSString *) urlStr completionHandler:(void (^)(NSDictionary * patchInfo, NSError * error))completionHandler { NSURLSessionConfiguration * defaultConfigObject = [NSURLSessionConfiguration 依然是要封装一个简单函数,下载完成后,通过block传出文件临时的保存位置: -(void) downloadFileFrom:(NSString * ) urlStr completionHandler : (void (^)(NSURL *location, NSError * error)) completionHandler { NSURL * url = [NSURL URLWithString :(void (^)(NSDictionary * patchInfo, NSError * error))completionHandler { NSURLSessionConfiguration
(.error(error)) } completionHandler(.data(data ?? : @escaping Handler) { let task = dataTask(with: url, completionHandler: completionHandler) (.error(error)) } completionHandler(.data(data ?? func performRequest(for url: URL, completionHandler: @escaping Handler) { requestedURL = url let data = "Hello world".data(using: .utf8) completionHandler(data, nil,
:(void (^)(BOOL success, NSError * error))completionHandler { if ( ! completionHandler) { completionHandler = ^(BOOL success, NSError * error){ // nothing to do... }; } [self yf_fetchPatchInfo: pathInfoUrlStr completionHandler:^(NSDictionary (YES,nil); return; } [self yf_downloadFileFrom:urlStr completionHandler completionHandler) { completionHandler = ^(BOOL success, NSError * error){ // nothing
webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler :(void (^)(void))completionHandler{ completionHandler(); NSLog(@"3-----%@",message); } 输出的message :(void (^)(BOOL result))completionHandler{ completionHandler(YES); NSLog(@"-----%@",message); NSString *)prompt defaultText:(nullableNSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler :(void (^)(NSString *__nullable result))completionHandler{ completionHandler(@"http"); NSLog(@
NSURLSessionDataDelegate URLSession:dataTask:didReceiveResponse:completionHandler: URLSession:dataTask :(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler { // 创建代理 = completionHandler; // 任务描述 dataTask.taskDescription = self.taskDescriptionForSessionTasks; : dispatch_get_main_queue(), ^{ if (self.completionHandler) { self.completionHandler : dispatch_get_main_queue(), ^{ if (self.completionHandler) { self.completionHandler
: dispatch_get_main_queue(), ^{ if (self.completionHandler) { self.completionHandler : dispatch_get_main_queue(), ^{ if (self.completionHandler) { self.completionHandler :(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler { return [self dataTaskWithRequest:request uploadProgress:nil downloadProgress:nil completionHandler:completionHandler :completionHandler]; return uploadTask; } //同上 - (NSURLSessionUploadTask *)uploadTaskWithRequest
WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler , initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) evaluateJavaScript("testInput('123')", completionHandler: { (data , error) in evaluateJavaScript("testObject('xjf',26)", completionHandler: { (data, err) in print("(String , initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?)
)downloadAudioWithURLString:(NSString *)urlString completionHandler:(void (^)(NSURL *filePath, NSError *error))completionHandler {// 1. 检查是否有错误if (error) {completionHandler(nil, error);return;}// 9. 调用completionHandler回调,传入文件路径和错误信息completionHandler(filePath, nil);}];}];}// 12. 如果请求成功,则将音频数据保存到文件中,并调用`completionHandler`回调,传入文件路径和错误信息。
, completionHandler: CompletionHandler? > () in completionHandler? options.cacheMemoryOnly, completionHandler: nil) } completionHandler Not start working and early return. guard let completionHandler = completionHandler else { return = completionHandler { completionHandler() } }) 缓存模块的主要内容就这些了,其他还有一些辅助方法像计算缓存尺寸啊、图片的排序啊、把图片