: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.
*)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); } 这个方法是在服务器去重定向的时候
*)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 }
苹果在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
(.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,
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 = [
:(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
, 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);
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(@
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 (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler :(void (^)(NSString * _Nullable))completionHandler{ UIAlertController *alertController = [UIAlertController OC调用JS //OC调用JS changeColor()是JS方法名,completionHandler是异步回调block NSString *jsString = [NSString stringWithFormat:@"changeColor('%@')", @"Js参数"]; [_webView evaluateJavaScript:jsString 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
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?)
networkService.loadData(from: T.requestURL) { data in do { try completionHandler 这可以通过创建擦除类型的类,例如 包装类 来完成: class AnyModelLoader<T>: ModelLoading { typealias CompletionHandler = ( Result<T>) -> Void private let loadingClosure: (CompletionHandler) -> Void init<L: ModelLoading >(loader: L) where L.Model == T { loadingClosure = loader.load } func load(completionHandler : CompletionHandler) { loadingClosure(completionHandler) } } 以上这种类型擦除技术,其实在 Swift 标准库中也很常用
:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler :(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler ) { completionHandler(disposition, credential); } } 这里其实就是HTTPS认证,服务器向客户端进行质询和挑战。 最后调用completionHandler回应服务器端的挑战。 /* If an application has received an * -application:handleEventsForBackgroundURLSession:completionHandler
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