[IOS多线程]的使用:防止进行HTTP数据请求时,UI卡死。

一、非多线程HTTP请求

如果不使用多线程,IOS的HTTP访问请求,以登录的模式为例,是这样:

//此为不正确的代码
//成功进行登录验证后进入到下一ViewController
-(void)presentToNextview{
    //到下一界面
}

//登录验证
-(void)loginCheck{
    //包含POST或GET请求来完成数据的验证,验证成功就跳转到下一界面
}

-(void)showindicator{
    //显示登录时转圈圈的菊花
}

//登录按钮的点击事件
-(IBAction)loginBTN:(id)sender{
    //执行的函数有:
    [self showindicator];
    [self loginCheck];
}

这样写代码的结果就是indicator菊花一到logincheck函数执行就会卡主,直到POST或GET请求完成才“卡到下一界面”。

网络不好的情况下就是类似死机状态。

二、多线程的实现。

1.子线程的创建:两种方法

第一种: [NSThread detachNewThreadSelector:@selector(downloadImage:) toTarget:self withObject:kURL];

第二种:NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(downloadImage:) object:kURL];

[thread start];

差异:第一种直接方便,第二种在启动前可以对其的stack等参数配置,更具灵活性。

2.在子线程中召唤主线程做事:

[self performSelectorOnMainThread:@selector(函数名) withObject:nil waitUntilDone:YES];

//如果waitUntilDone参数为YES,那么当前线程会被阻拦,直到selector运行完。

3.代码简单示例一:登录

//此为多线程实现登录放UI卡死的代码
//成功进行登录验证后进入到下一ViewController
-(void)presentToNextview{
    //到下一界面
}

//登录验证
-(void)loginCheck{
    //包含POST或GET请求来完成数据的验证,验证成功就跳转到下一界面
   if(账号密码匹配){
        //召唤主线程跳转到下一界面
        [self performSelectorOnMainThread:@selector(presentToNextview) withObject:nil waitUntilDone:YES];
   }
}

-(void)showindicator{
    //显示登录时转圈圈的菊花
}

//登录按钮的点击事件
-(IBAction)loginBTN:(id)sender{
    //执行的函数有:
    [self showindicator];

    //开辟新的线程,执行需要联网耗时的函数loginCheck
    [NSThread detachNewThreadSelector:@selector(loginCheck) toTarget:self withObject:nil];
}

4.代码示例二:显示一张网上的图片,源代码:

DownloadViewController.h

#import <UIKit/UIKit.h>
#import "FileConnection.h"
@interface DownloadViewController : UIViewController

@end

DownloadViewController.m

#import "DownloadViewController.h"
#define kURL @"http://b.hiphotos.baidu.com/image/pic/item/32fa828ba61ea8d37ccb6e0e950a304e241f58ca.jpg"
@interface DownloadViewController ()

@property UIImageView *imageView;

@end

UIActivityIndicatorView* activityIndicatorView;

@implementation DownloadViewController

-(void)downloadImage:(NSString *) url{
    NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
    UIImage *image = [[UIImage alloc]initWithData:data];
    if(image == nil){
        NSLog(@"没有图片");
    }else{
        NSLog(@"刷新图片");
        [  activityIndicatorView stopAnimating ];//停止
        //通知主线程做事
        [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:NO];
        //如果waitUntilDone参数为YES,那么当前线程会被阻拦,直到selector运行完。
    }
}

-(void)updateUI:(UIImage*) image{
    self.imageView.image = image;
    //sleep(5);
}

-(void)showindicatior{
    activityIndicatorView = [ [ UIActivityIndicatorView  alloc ] initWithFrame:CGRectMake(250,30,30.0,30.0)];
    activityIndicatorView.activityIndicatorViewStyle= UIActivityIndicatorViewStyleGray;
    [self.view addSubview:activityIndicatorView];
    [activityIndicatorView startAnimating];//启动

}
- (void)viewDidLoad
{
    [super viewDidLoad];

    self.imageView=[[UIImageView alloc] initWithFrame:CGRectMake(10, 60, 300, 220)];

    [self.view addSubview:self.imageView];

    //显示菊花
    [self showindicatior];

    //开辟一个新的线程 2种方法
    [NSThread detachNewThreadSelector:@selector(downloadImage:) toTarget:self withObject:kURL];
    //NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(downloadImage:) object:kURL];
    //[thread start];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

[IOS多线程]的使用:防止进行HTTP数据请求时,UI卡死。

时间: 2025-01-16 20:23:18

[IOS多线程]的使用:防止进行HTTP数据请求时,UI卡死。的相关文章

VUE.JS 使用axios数据请求时数据绑定时 报错 TypeError: Cannot set property &#39;xxxx&#39; of undefined 的解决办法

正常情况下在data里面都有做了定义 在函数里面进行赋值 这时候你运行时会发现,数据可以请求到,但是会报错 TypeError: Cannot set property 'listgroup' of undefined 主要原因是: 在 then的内部不能使用Vue的实例化的this, 因为在内部 this 没有被绑定.可以看下 Stackoverflow 的解释: 解决办法: 1.用ES6箭头函数,箭头方法可以和父方法共享变量 2.在请求axios外面定义一下 var that=this 问题

VUE - 使用axios数据请求时数据绑定时 报错 TypeError: Cannot set property &#39;xxxx&#39; of undefined 的解决办法

created() { var that=this axios.get('http://jsonplaceholder.typicode.com/todos') .then(function (res) { // handle success // console.log(res); that.todos = res.data }) .catch(function (error) { // handle error console.log(error); }) .finally(function

iOS开发——网络Swift篇&amp;NSURL进行数据请求(POST与GET)

NSURL进行数据请求(POST与GET) 使用Swift进行iOS开发时,不可避免的要进行远程的数据获取和提交. 其数据请求的方式既可能是POST也可能是GET.同不管是POST还是GET又可以分为同步请求和异步请求. 下面通过四个例子来进行演示. 1,使用POST方式提交数据(用户id和分数) (1)同步请求 1 //保存分数 2 func saveScore(score:Int, userid:String) 3 { 4 let urlString:String = "http://han

iOS经验1:自己写的网络数据请求 第三方框架 断点续传 上传下载

镔哥哥做项目,一般的数据请求不管他多复杂,只要自己写好了请求,那么调用永远是那么的简单,那么我介绍一下 一:需要用到第三方框架AFNetworking,直接写在工程pch头文件里就行因为经常用到它,这在网上随便下载就行,最好用cocopod来下载,这样什么都有了,cocopod是什么,我就不说,博客上面有介绍. 开始啦: 1:自定义网络请求DataRequestManager类专门管理网络用的 朋友们以下代码就可以直接复制来用了 .h文件 //  DataRequestManager.h // 

当对服务器端返回的极光推送数据请求时,AFN 的 GET 请求失败如何解决

代码段 控制台 只需在 manager 那里添加一行代码即可 //传入json格式数据,不写则普通post manager.requestSerializer = [AFJSONRequestSerializer serializer];//默认返回JSON类型(此句可以不写) manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];//设置相应内容类型

IOS多线程-个人理解

一.多线程 每一个iOS应用程序中都有一个主线程用来更新UI界面.处理用户的触摸事件.解析网络下载的数据,因此不能把一些太耗时的操作(比如网络下载数据)放在主线程中执行,不然会造成主线程堵塞(出现界面卡死,防止界面假死),带来极坏的用户体验. iOS的解决方案就是将那些耗时的操作放到另外一个线程中去执行,多线程异步编程是防止主线程堵塞,增加运行效率的最佳方法 异步:多个线程 同时执行 同步:线程排队执行并行 ->异步串行->同步 多线程技术 1.异步下载数据,是多线程技术的一个比较常见的应用场

iOS多线程 GCD

iOS多线程 GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. /*! * @function dispatch_get_main_queue * * @abstract * Returns the default queue that is bound to the main thread. *

iOS多线程编程

1. 进程,线程, 任务 进程:一个程序在运行时,系统会为其分配一个进程,用以管理他的一些资源. 线程:进程内所包含的一个或多个执行单元称为线程,线程一般情况下不持有资源,但可以使用其所在进程的资源. 任务:进程或线程中要做的事情. 在引入线程的操作系统中,通常把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位. 线程比进程更小,对其调度的开销小,能够提高系统内多个任务的并发执行程度. 一个程序至少有一个进程,一个进程至少有一个线程.一个程序就是一个进程,而一个程序中的多个任

关于iOS多线程的总结

关于iOS多线程的总结 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项.当然也会给出几种多线程的案例,在实际使用中感受它们的区别.还有一点需要说明的是,这篇文章将会使用 Swift 和 Objective-c 两种语言讲解,双语幼儿园.OK,let's begin! 概述 这篇文章中,我不会说多线程是什么.线程和进程的区别.多线程有什么用,当然我也不会说什么是串行.什么是并行等问题,这些我们应该都知道的. 在 iOS 中其实目前有 4 套多线程方案,他们分