iOS线程操作

 //导入响应的MBProgressHUD
         // 显示遮盖
        [MBProgressHUD showMessage:@"正在登录中"];
 //利用 GCD开启一个线程,
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            
            // 移除遮盖
            [MBProgressHUD hideHUD];
            
            
            // 执行segue
            [self performSegueWithIdentifier:@"login2contact" sender:nil];
        });
        






//在block里面回掉传值步骤例如A主要判断连接的状态
//1.在一个控制器或者类文件定义回掉枚举方法
typedef enum {
    XMPPResultTypeLoginSuccess,//登录成功
    XMPPResultTypeLoginFailure,//登录失败
    XMPPResultTypeNetErr//网络不给力
}XMPPResultType;


typedef void (^XMPPResultBlock)(XMPPResultType type);// XMPP请求结果的block


//并且在.m想用到这个代码快就可以把这个代码快一参数的形式传递过来
-(void)xmppUserLogin:(XMPPResultBlock)resultBlock{
    
    // 先把block存起来
    _resultBlock = resultBlock;
    
//    Domain=XMPPStreamErrorDomain Code=1 "Attempting to connect while already connected or connecting." UserInfo=0x7fd86bf06700 {NSLocalizedDescription=Attempting to connect while already connected or connecting.}
    // 如果以前连接过服务,要断开
    [_xmppStream disconnect];
    
    // 连接主机 成功后发送密码
    [self connectToHost];
}


//B护着刷新主界面
 [app xmppUserLogin:^(XMPPResultType type) {
        [selfVc handleResultType:type];
    }];


-(void)handleResultType:(XMPPResultType)type{
    // 主线程刷新UI
    dispatch_async(dispatch_get_main_queue(), ^{
        [MBProgressHUD hideHUDForView:self.view
         ];
        switch (type) {
            case XMPPResultTypeLoginSuccess:
                NSLog(@"登录成功");
                [self enterMainPage];
                break;
            case XMPPResultTypeLoginFailure:
                NSLog(@"登录失败");
                [MBProgressHUD showError:@"用户名或者密码不正确" toView:self.view];
                break;
            case XMPPResultTypeNetErr:
                [MBProgressHUD showError:@"网络不给力" toView:self.view];
            default:
                break;
        }
    });
    
}


//A
// 回调控制器登录成功
    if(_resultBlock){
        _resultBlock(XMPPResultTypeLoginSuccess);
    }


// 判断block有无值,再回调给登录控制器
    if (_resultBlock) {
        _resultBlock(XMPPResultTypeLoginFailure);
    }
    
 // 如果没有错误,表示正常的断开连接(人为断开连接)
    
    
    if(error && _resultBlock){
        _resultBlock(XMPPResultTypeNetErr);
    }
 













这只是最简单的使用,后续如果热度高的话,再录个视频教程详解吧,学到的好评给一个~ 前  言 · 之前刚接触鱼刺的时候发了个 【鱼刺线程池,自动换IP,队列重试框架(https://bbs.125.la/forum.php?mod=viewthreadtid=14178530 )】 发现热度还不错,大家还是挺喜欢多线程操作。 常言道:授人以鱼不如授人以渔,鱼刺类模块一直感觉确实稳定好用,对于新手来说一些命令还是比较难理解的。但不知道为什么一直没有详细教程。 今天趁这次开源大赛曾个热度 讲一下鱼刺多线程应用中 线程池Ex的使用方法,废话不多说,直接开始吧。 注: 所讲内容都是自己使用中所得出来的经验,如果讲的不好或者不对得地方请大佬指导哈。 已经请示过作者了: @Bints 首先我们需要下载并载入 教程以 鱼刺类_多线程应用5.43为主:鱼刺类_多线程应用v5.4.zip (112.11 KB, 下载次数: 228) 我们先来看看“鱼刺类_线程池Ex”的命令: 几个参数先说一下: 1.初始栈大小 :可以理解为申请内存的空间的初始大小(个人是这么理解的)。必须是4KB的倍数且最小8KB(8192字节)所以最小为8*1024,不用担心太少,任何情况下Windows会根据需要动态延长堆栈的大小 2.是否在UI线程 :如果填写了真,那么在循环里面会加个"处理事件()"的命令来让消息循环 去队列处理窗口组件操作 防止执行的时候窗口卡死,(记得在哪里看到过线程中处理事件()是没有效果的。不太懂~~) 1. 置_初始栈大小()  设置初始栈的大小,也可以在创建()的第五个参数中设置。此命令可以在线程池工作中设置。 2. 置_空闲回收事件()  设置线程空闲回收的时间,也可以在创建()的第三个参数中设置,此命令可以在线程池工作中设置。 3. 置_最大线程数()  设置最大线程数量,也可以在创建()的第二个参数中设置,此命令可以在线程池工作中设置。 4. 创建() :顾名思义 创建线程池。 5. 投递任务() ,向线程池中投递一个可执行的函数子程序指针,和投递任务_int()基本一模一样,在内部自动转换成指针地址到整数(子程序指针) 6. 投递任务_int()  向线程池中投递一个可执行的函数指针地址 7. 等待任务动态()  :就是等待线程,到指定的等待时间才会往下执行,可以用 触发任务动态来取消等待。 8. 触发任务动态() .这个需要和等待任务动态一起用,也可以理解为 放弃等待中的任务 继续向下执行 9. 暂停()  暂停正在工作的线程,配合 事件_暂停() 使用效果最佳,后续会详解。 10. 事件_暂停()   需要配合暂停命令。如果系统发出了暂停命令返回假 如果正常工作返回真,如果正在销毁的话也会返回假。 11. 继续()  取消暂停。 12. 取_队列任务数()  获取队列中的正在执行的线程数量。 13. 取_空闲任务数()  获取队列中的空闲线程数量,严格控制线程数量可以用到此命令,后续会详解。 14. 取_是否空闲()  获取线程池状态是否彻底空闲,也就是说任务是否全部执行完毕,可以作为后续投递任务完任务后的判断。 15. 取_线程池容量()  获取线程池的可执行的最小线程数量 16. 取_最大线程容量()  获取线程池中可执行的最大线程数量 17. 取_执行线程数()  获取正在工作的线程数量 18. 取_状态()  获取线程正在工作的状态,返回值为常量中的: #线程池_未启动 #线程池_正在工作,#线程池_正在销毁,#线程池_正在创建 下面开始实战,将会用到所有线程池Ex中的命令 首先载入模块后在程序集变量中创建一个线程池Ex。 创建一个按钮。在按钮事件中写入:要执行的任务数量为1000 线程数量为50 如果已知 执行数量为1000了 直接计次循环 写下去可能执行不够准确,因为不排除会投递失败的情况。所以我们: 如下图:只有在投递任务成功的时候 计次才会递增。 但是每次循环都会判断 递增的计次是否小于任务数量, 如果小于就继续执行,如果大于就说明投递的任务数量已经达到了目标任务数,就可以跳出循环了 上图中:投递任务()命令 传递了两个参数 一个是局_计次 一个是 0, 投递 局_计次 可以在任务函数中获取到 用处也比较大,比如可以用作超级列表框的索引。(前提是已经插入了) 等待任务动态().为什么要等待呢,又是时候你投递的是内存指针,投递进去后等待 任务函数将它获取到并释放完毕后触发任务动态就好了 比如: 这样看着没什么问题 是吧~~ 内存方面的知识后续再说把 先掠过,只是这样演示这节只讲线程池Ex 但是如果我们模拟一下真是线程场景 加个延时() 如上图所示,如果有延时的话线程池投递完任务直接销毁 会导致任务被中断,或者放弃了
v4.7(2019-05-23)修正第二次创建代理提取架构后无法获取到代理的问题增加了两个新的函数`获取代理Ex()` `自压入代理Ex()`  '//详情请查看`例程2.e`增加了两个例程`例程1.e` `例程2.e`使用方法:1.  (编辑配置)1.1 编辑运行目录下的`Config_Proxy.ini`填写提取和验证参数并保存 1.2 如果程序目录下没有`Config_Proxy.ini`这个文件 请调用一次`代理智能提取_创建()`会自动生成在运行目录下1.3 你也可以用代码来配置这些信息 直接调用 `代理智能提取_置代理提取参数()` `代理智能提取_置代理验证参数()` `代理智能提取_置代理生命值()` `代理智能提取_置代理最长存活时间()`2.  (创建和获取状态)2.1 在执行工作前调用一次 `代理智能提取_创建()`  (比如: `启动按钮_被单击`)2.2 你可以搞个时钟/定时器来刷新代理智能提取模块的工作状态2.3 当你打算结束工作/工作完毕时记得执行 `代理智能提取_销毁()`3.  (提取代理)3.1 当你需要用代理时 直接调用`代理智能提取_获取代理()`即可得到一条代理3.2 没错 你可以在任意环境下调用`代理智能提取_获取代理()` (比如:在并发线程中调用)4.  (总结)如果你已修改好了提取配置 你其实可以很轻松的使用它 只要先创建 然后只管在任意线程获取代理即可 代理快不够了会自动提取补充就像下面这样创建()获取代理()'//线程A获取代理()'//线程B获取代理()'//线程C...销毁()--------------------------------------------Config_Proxy.ini 配置说明:触发补充阀值     : 当前剩余代理小于这个数值会触发自动提取并验证补充代理(0=自动(本次提取数量\5 5且>=5))提取地址         : 用于提取代理的API地址提取分隔符       :  提取后用这个分隔符来分割成多条 默认=\\r\\n(换行符) (本参数也支持正则匹配)是否正则分割     : 是否使用正则匹配 1=使用正则匹配(正则必须包含两个子匹配项1为地址2为端口) 0=使用分割文本匹配提取附加协议头   : 提取代理时附加的HTTP协议头 默认=空(默认协议头)提取间隔         : 两次提取最小间隔(毫秒) 为了防止提取API接口限制提取频繁冻结 默认=1000(1秒)----------------验证地址         : 用于验证代理是否有效的url 比如IP138 又比如百度  |如果想不验证提取的代理直接使用 请设置为:不验证是否UTF8解码     : 验证代理返回的网页内容是否进行UTF8解码 1=解码 0=不解码提取附加协议头   : 验证代理时附加的HTTP协议头 默认=空(默认协议头)验证特征         : 验证代理URL返回的内容里存在这个特征既是有效(比如验证地址是(百度) 特征可以是'百度一下')验证超时         : 验证代理超时 默认=12 (秒)尝试验证次数     : 尝试验证次数 默认=1 (次)代理生命值       : 提取的代理能被获取几次 默认=1 (次)  (比如采集东西的时候就可以设置10-50次)代理最长存活时间 : 提取的代理最长存活时间 0=不启用(默认) 大于0=启用(秒) 提取的代理过了这个时间后 将不会被提取直接被丢弃--------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值