delegate

AFNetworking封装-项目使用

烂漫一生 提交于 2020-04-24 17:47:26
本篇博客是接着上一篇AFNetworking源码解析的后续,如果想对AFNetworking源码有所了解。 请读一下 https://www.cnblogs.com/guohai-stronger/p/9191497.html 。 YTKNetwork的源码详解: https://www.cnblogs.com/guohai-stronger/p/9194519.html 这篇博客主要是对AFNetworking代码进行封装,也是自己在实际项目中所使用过的(对中小型企业或者项目)可直接使用,也会在github上传(偷偷窃喜一下,一直想在github上有所项目,一直没有时间),趁着端午几天有时间,给github贡献点自己力量。本篇读下来大约10-15分钟,欢迎指正。 一.结构解析 最核心(可直接拖拽到新项目中) (拓展cocoapods的拖入) 拖入之前,需要导入AFNetworking,最好利用cocoapods导入,cocoapods导入时 vim Podfile --->输入i platform :ios, ' 8.0 ' target " targetName " do pod ' AFNetworking ' end (有一点在 然后按Esc,并且输入“ :”号进入vim命令模式,然后在冒号后边输入wq )最后pod install。编译一下,拖入项目的类就好了

AFNetworking源码解析与面试考点思考

走远了吗. 提交于 2020-04-24 16:48:18
最近重读了AFNetworking 3.x的源码,算是温故而知新吧。也梳理了一些优秀的代码细节和面试考点,罗列下来,发现这个库小而精致,简直初学者的宝藏库。 开源库怎么看? 先说个题外话,阅读优质的开源代码库,绝对是程序员们快速提升自我的有效途径,而怎样高效率的去阅读源码同样也是一个问题,不知道有没有人和我之前一样,碰到过读倒是读了,但总感觉收获不大的情况。 这里分享一下我的一些读码经验: 多思考,多抛出问题,比如说 整体的代码结构是怎样的?类与类之间的关系是怎样的?为什么要这么设计? 代码有没有涉及到多线程,其线程模型是怎样的?哪类问题可以适用这种多线程的方案? 代码中使用了哪些设计模式?具体是怎么实现的? 也可以关注代码细节,遇到不熟悉的用法不要放过,多刨根究底才能夯实基础 关于 AFNetworking 的一些优秀代码细节,我这里也整理了一部分,可以查阅后文 一定要记笔记和总结,能分享更好。 参考费曼学习法,我认为这一点是最好的加深理解和强化记忆的手段。随着年龄的增大,记忆力会有所衰退,有个笔记能够回顾,能节约大把再次记忆的时间。此外,多与人分享还能够提升自己的影响力,与人交流验证,也能够为自己查缺补漏。 AFNetworking 3.x的代码结构 还是说回到 AFNetworking 这里,AF的代码结构大部分人应该都了解,这里我简单介绍下。 AFNetworking 3

探索c#之Async、Await剖析

↘锁芯ラ 提交于 2020-04-24 15:52:54
阅读目录: 基本介绍 基本原理剖析 内部实现剖析 重点注意的地方 总结 基本介绍 Async、Await是net4.x新增的异步编程方式,其目的是为了简化异步程序编写,和之前APM方式简单对比如下。 APM方式,BeginGetRequestStream需要传入回调函数,线程碰到BeginXXX时会以非阻塞形式继续执行下面逻辑,完成后回调先前传入的函数。 HttpWebRequest myReq =(HttpWebRequest)WebRequest.Create("http://cnblogs.com/"); myReq.BeginGetRequestStream(); //to do Async方式,使用Async标记Async1为异步方法,用Await标记GetRequestStreamAsync表示方法内需要耗时的操作。主线程碰到await时会立即返回,继续以非阻塞形式执行主线程下面的逻辑。当await耗时操作完成时,继续执行Async1下面的逻辑 static async void Async1() { HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create("http://cnblogs.com/"); await myReq.GetRequestStreamAsync(); //to do }

activiti 工作流 动态 设置 指定 节点任务人、责任人、组 的实现方式

浪尽此生 提交于 2020-04-24 14:53:00
首先给大家看一下我的流程图: 流程文件leaveBill.bpmn <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"> <process id=

activiti 7 + springboot2(八) Activiti流程实例动态设置assignee执行人

≯℡__Kan透↙ 提交于 2020-04-24 14:11:29
(一)activiti流程图用流程变量设置节点执行人 Activiti 使用 UEL 表达式, UEL 是 java EE6 规范的一部分, UEL(Unified Expression Language)即统一表达式语言, activiti 支持两个 UEL 表达式: UEL-value 和 UEL-method。 <!-- UEL-value: user1 是一个流程变量 --> < userTask activiti:assignee ="${user1}" activiti:exclusive ="true" id ="_3" name ="申请人提交申请" /> <!-- UEL-method: user 是一个流程变量对象, user1.assignee 表示通过调用 user1 的 getter 方法获取值 --> < userTask activiti:assignee ="${user1.assignee}" activiti:exclusive ="true" id ="_3" name ="申请人提交申请" /> (二)方法调用赋值 ${userService.findUserById(userId)} userService 是 spring 容器的一个 bean, findUserById 是该 bean 的一个方法, userId 是流程变量。 (三

基于事件的网关 Event­based Gateway

回眸只為那壹抹淺笑 提交于 2020-04-24 14:05:18
基于事件的网关 Event­based Gateway 作者:Jesai 时间:2018年4月21日 21:19:30 什么是事件网关? 基于事件的网关,允许基于事件做选择。 事件网关的执行原理? 网关的每一条出口顺序流,都需要连接至一个捕获中间事件。当流程执行到达基于事件的网关时,网关类似等待状态地动作:执行被暂停。并且,为每一条出口顺序流,创建一个事件订阅。流程的走向完全是由于中间事件的选择。而由哪一个事件来决定流程的走向则是由最先触发的事件来决定的。 事件网关和其他网关的区别 请注意基于事件的网关,其出口顺序流与一般的顺序流不同。这些顺序流从不实际被执行。相反,它们允许流程引擎决定,当执行到达一个基于事件的网关时,需要订阅什么事件。 约束: 1)一个基于事件的网关,必须有两条或更多的出口顺序流。 2)基于事件的网关,只能连接至 intermediateCatchEvent(捕获中间事件) 类型的元素(Activiti不支持基于事件的网关后,连接接收任务,Receive Task)。 3)连接至基于事件的网关的 intermediateCatchEvent ,必须只有一个入口顺序流。 图标: 基于事件的网关,用内部带有特殊图标的网关(菱形)表示。 定义: 用于定义基于事件的网关的XML元素为 1 eventBasedGateway 。 流程设计 我们设计一个有三个走向(分支

图片点击全屏预览+缩放(Swift 5.0)

房东的猫 提交于 2020-04-24 02:23:10
图片点击全屏预览+缩放(Swift 5.0),直接上代码: import UIKit class ViewController: UIViewController ,UIScrollViewDelegate { var scrollView:UIScrollView? var lastImageView:UIImageView? var originalFrame:CGRect! var isDoubleTap:ObjCBool! //使用sb拖控件显示图片 @IBOutlet weak var myImageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() myImageView.isUserInteractionEnabled = true let tap = UITapGestureRecognizer.init(target: self, action: #selector(showZoomImageView(tap:))) self.myImageView.addGestureRecognizer(tap) } @objc func showZoomImageView( tap : UITapGestureRecognizer) { let bgView = UIScrollView

简单易懂iOS大厂面试篇

一世执手 提交于 2020-04-23 18:59:29
引言 目前经济增速的放缓,到处都在鼓吹互联网发展进入下半场。今年跳槽季的遭遇想必大家也是感受到了一丝寒意。笔者有一个朋友在阿里工作,今年3月底开始请他帮忙内推,也许是阿里的大前端战略,也许真的是互联网的寒意。对于一个三年的iOSer上海这边一直没有合适的岗位可推,即便是有也是招P7级别,统统被拒的命运。我也是放弃了希望,开始找其它渠道推销自己,不过最终还是找到了心仪的工作,现在终于可以做一下总结了。 一、概述 前期面试还是很有激情的,每次面试完毕都会回忆并记录,总结,再学习。其实这个过程也是一个非常有效的学习过程。不过代价有点大,你可能会失去一次机会。最好的方式,还是做好充足的准备。我在说什么?好吧,好像是一些感慨之类的。能体会到的读者,就请点个赞吧,哈哈!没体会到的读者就当没看到吧,反正仅仅是感慨而已,哈哈嗝! 二、个人总结 1. 经历总结 还是简单再说下,这段时间的经历吧。首先这段经历是从老司机周报开始的,因为之前就和周报的峰哥有些联系,所以看到周报的内推时,也就自然而然的联系峰哥内推了。首先就是字节跳动,不过简历筛选都没通过。帮忙内推的曾鸣大佬说出了原因: 没有大厂背景 不是985院校毕业(笔者本人211院校毕业) 简历没有亮点 没办法,确实没亮点。之后峰哥也是帮忙指导了简历,我也尽量按照STAR法则修改了简历,通过其他渠道投递了字节跳动不过也都没有机会。可能是有失败记录

C# 委托(delegate)、泛型委托和Lambda表达式

梦想与她 提交于 2020-04-23 07:27:00
[toc] # 什么是委托 1、从数据结构来讲,委托是和类一样是一种用户自定义类型。 2、委托是方法的抽象,它存储的就是一系列具有相同参数和返回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行。 # 委托声明、实例化和调用 1、声明 委托是一种特殊的类,因此委托的声明与类的声明方法类似,在任何可以声明类的地方都可以声明委托。委托声明用delegate关键字,同时委托要指明方法参数和返回值,写法与方法类似。综合类的声明和方法的声明,委托声明写成如下形式: [访问修饰符] delegate 返回值类型 委托名 (形参列表); public delegate void MyDel();//定义了一个委托MyDel,它可以注册返回void类型且没有参数的函数 public delegate void MyDel1(string str);//定义了一个委托MyDel1,它可以注册返回void类型且有一个string作为参数的函数 public delegate int MyDel2(int a,int b);//定义了一个委托MyDel2,它可以注册返回int类型且有两个int作为参数的函数 2、委托的实例化 与普通类的使用方法相同,声明了委托之后,我们必须给委托传递一个具体的方法,才能在运行时调用委托实例。委托实例包含了被传递给它的方法的信息,在运行时

C#的委托案例

与世无争的帅哥 提交于 2020-04-23 04:56:03
C#实现(Delegate)的委托就不多说了,直接上代码,看代码中的注释: namespace Delegate { delegate void DGSayiHi( string name); // 声明委托 delegate void DGDo( string name); class Program { static void Main( string [] args) { DGSayiHi sayhi = new DGSayiHi(SayChineseHi); DGSayiHi sayhi2 = new DGSayiHi(SayEnglishHi); sayhi += sayhi2; // 实际上+=相当于Delegate.Combine, -=相当于Delegate.Remove sayhi( " 春晓 " ); Console.ReadLine(); } static void SayChineseHi( string name) { Console.WriteLine( " 你好: " + name); } static void SayEnglishHi( string name) { Console.WriteLine( " Hello: " + name); } } } 来源: oschina 链接: https://my.oschina.net/u