`

IOS用GCD调接口

 
阅读更多

本文以UIActivityIndicatorView为例,有没有同学试过调接口,调接口的时候会不会想要有个UIActivityIndicatorView去转圈圈来表示正在等待呢?但是你如果直接调接口的话,即使你用UIActivityIndicatorView ,会不会怎么也无法显示呢? 如果遇到这种情况,用GCD就可以,不过好麻烦就是了…… 

 

- (IBAction)queryUser:(id)sender
{
    [telephoneTextField resignFirstResponder];
    
    //开始转圈圈
    [indicator setHidden:NO];
    [indicator setHidesWhenStopped:YES];
    [indicator startAnimating];//转圈圈
    //采用GCD,如果调接口成功或者失败,圈圈停止
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSString *telephone = telephoneTextField.text;
        if ([telephone length] == 0)
        {
            //执行主线程
            dispatch_async(dispatch_get_main_queue(),  ^{
                UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"业务号码不能为空" message:@"请重新输入条件查询!" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
                [alertView show];
                [alertView release];
                
                [indicator stopAnimating];//停止圈圈
            });
            return;
        }
        //调用接口
        UserQueryBO *userQueryBO = [[UserQueryBO alloc] init];
        NSDictionary *resultList = [userQueryBO queryUser:telephone forUser:nil];
//接口返回值
        NSString *returnCode = [NSString stringWithFormat:@""];
        NSString *message= [NSString stringWithFormat:@""];
        NSString *resultInfo= [NSString stringWithFormat:@""];
        if (resultList != nil)
        {
            returnCode = [resultList objectForKey:@"ReturnCode"];
            message = [resultList objectForKey:@"Message"];
            resultInfo = [resultList objectForKey:@"ResultInfo"];
            //NSLog(@"%@", resultInfo);
        }
        if ([returnCode isEqualToString:@"0"])
        {
            if ([resultInfo length] > 0)
            {
                //成功调用主线程,利用主线程里navigationController去打开新页面
                dispatch_async(dispatch_get_main_queue(),  ^{
                    UserQueryShowVC *userQueryShowVC = [[UserQueryShowVC alloc] init];
                    userQueryShowVC.userInfo = resultInfo;
                    [self.navigationController pushViewController:userQueryShowVC animated:YES];
                    self.navigationController.title = @"用户查询详情";
                    [userQueryShowVC release];
                });
                
            }
            else
            {
                //接口调用失败,利用主线程打开输入框
                dispatch_async(dispatch_get_main_queue(),  ^{
                    UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"没查询到相关用户信息" message:@"请重新输入条件查询!" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
                    [alertView show];
                    [alertView release];
                    [indicator stopAnimating];//停止圈圈
                });
            }
        }
        else
        {
            //接口调用失败,利用主线程打开输入框
            dispatch_async(dispatch_get_main_queue(),  ^{
                UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"查询失败" message:[@"请重新输入条件查询!失败信息:" stringByAppendingString:message] delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
                [alertView show];
                [alertView release];
                [indicator stopAnimating];//停止圈圈
            });
        }
        //[resultInfo release];
        //[message release];
        //[returnCode release];
        [userQueryBO release];
        //这里,保险起见,再停止圈圈……
        dispatch_async(dispatch_get_main_queue(),  ^{
            
            [indicator stopAnimating];
        });
    });
    
}

 代码如上,用//采用GCD

    dispatch_async(dispatch_get_global_queue(0, 0), ^{});将接口逻辑放在这里,如果需要停止圈圈或者弹出对话框,则用

dispatch_async(dispatch_get_main_queue(), ^{ 

            [indicator stopAnimating];

 

        });

去会写数据到主线程。

 

记得,不这样的话会报错的说

 

分享到:
评论

相关推荐

    ios libcurl库的简单使用

    总的来说,libcurl库为iOS开发者提供了强大且灵活的网络请求解决方案,尽管其C语言的接口可能对一些开发者来说不太友好,但通过适当的封装,我们可以轻松地在Objective-C或Swift项目中集成和使用libcurl。

    IOS 使用的异步状态机

    3. **线程安全措施**: 异步状态机可能涉及到多线程操作,因此需要确保状态转换和回调函数的执行是线程安全的,可能使用GCD(Grand Central Dispatch)或其他并发机制。 4. **错误处理和调试辅助**: 可能会有日志...

    ios点餐系统源码

    这涉及到SDK的引入,调用支付接口,处理支付结果回调等。 八、权限管理 考虑到用户隐私,点餐系统可能需要获取用户的位置信息,这时需要处理Location Services的权限请求。同时,如果涉及到相机或相册,也需要处理...

    iOSblock方法的详细学习

    1. 回调处理:在网络请求中,常常用Block来处理成功或失败的回调。 ```objc [NSURLSession.sharedSession dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response,...

    IOS应用源码之CFFTPSample.rar

    2. **异步编程**:FTP操作通常涉及网络通信,因此需要处理异步任务,了解GCD(Grand Central Dispatch)、NSOperationQueue或Block回调的使用。 3. **错误处理**:学习如何捕获和处理FTP操作可能出现的错误,提供...

    IOS图片多选简单实用

    然而,由于在iOS 9之后被弃用,所以在现代iOS开发中不应再使用。 3. **PHPhotoLibrary**:取代ALAssetsLibrary的新版照片库框架,提供访问用户照片和视频的API。使用此框架,开发者可以请求访问权限并执行图片选择...

    iOS_Socket_即时通讯Demo

    AsyncSocket是由GCD(Grand Central Dispatch)构建的Objective-C库,它为iOS和macOS应用程序提供了一种简单的方法来处理TCP套接字。这个库使得开发者可以轻松地实现双向数据传输,同时处理多个连接,并且具有异步回...

    ios-简易定位器.zip

    这个“ios-简易定位器.zip”压缩包可能包含了一个简单的iOS应用示例,用于演示如何使用Core Location来获取用户的实时位置。下面我们将详细探讨相关知识点。 1. **Core Location框架**: Core Location是iOS SDK中...

    iOS UDP Demo

    对于异步操作,通常使用Grand Central Dispatch(GCD)的队列来处理接收的数据。 5. **错误处理**:由于UDP是不可靠的,因此需要处理可能的丢包和乱序问题。同时,需要捕获并处理可能出现的网络错误。 6. **网络...

    ios-多线程任务(想过来装逼而已).zip

    配合GCD或NSOperationQueue,可以确保网络请求在后台线程中执行,下载完成后,通过回调方法更新主线程的UI。 例如,使用GCD来异步下载数据: ```swift let url = URL(string: "http://example.com/data.json")! ...

    iOS数据请求封装

    - iOS中的网络请求通常基于URLSession,它是苹果推荐的网络编程接口,替代了旧的NSURLConnection。 - URLSession提供了异步操作的能力,可以在后台线程处理网络任务,避免阻塞主线程,提升用户体验。 2. **...

    ios开发 HTTP请求方法

    9. **异步回调与GCD**: 为了保证UI线程不被阻塞,通常在后台线程处理网络请求,然后使用Grand Central Dispatch (GCD)回到主线程更新UI。 10. **Moya和Alamofire**: 在实际项目中,为了简化网络请求,开发者通常会...

    ios-block 多参数传值.zip

    在iOS应用开发中,Block的使用非常常见,特别是在处理异步操作、事件回调或者复杂逻辑控制时。 Block的基本语法结构如下: ```swift ^(参数列表) -> 返回类型 { // Block体,包含执行的代码 } ``` 例如,一个...

    IOS中消息传递的8种方式Demo

    这种方式简化了接口,但可能失去了一些传统代理的灵活性。 在“MessageTransitionExample”这个Demo中,每个通信方式都会有一个具体的示例,开发者可以通过运行和分析代码来深入理解这些机制。同时,配合博主的博客...

    ios-Socket通信.zip

    "ios-Socket通信.zip"这个压缩包可能包含了关于如何在iOS平台上使用AsyncSocket库进行Socket通信的示例代码和教程。AsyncSocket是由GCD(Grand Central Dispatch)实现的一个异步Socket库,它简化了Socket编程的复杂...

    ios-封装GET、POST请求(基于AFNetworking).zip

    - 异步处理:AFNetworking使用了GCD(Grand Central Dispatch),能够自动管理网络请求的异步执行,避免阻塞主线程。 - 自动处理JSON和XML:AFNetworking内置了解析JSON和XML的能力,简化了数据解析步骤。 - 缓存...

    ios开发-iOS开发实用demo之多图片多线程下载实例.zip

    这可以通过监听`URLSession`的回调或使用自定义数据结构来实现。 6. **队列管理**: - 使用`DispatchQueue`可以控制并发下载的数量,避免过多的网络请求导致性能问题或超出服务器限制。 7. **错误处理**: - ...

    ios-dispatch的简单demo.zip

    `dispatch_source`是GCD提供的一种高级接口,用于监听特定的系统资源变化,如文件描述符、 mach端口、内存映射、信号量等。创建`dispatch_source`时,需要指定源类型、事件和处理函数。当触发指定事件时,GCD会自动...

    IOS开发的技术和要点

    - 协议:Objective-C的协议类似于Java和C++的接口,可以定义一组方法签名,类可以遵循多个协议。如`ClassA<Protocol>`。 7. **类别(Category)**: Objective-C允许通过类别扩展已有的类,添加方法而无需子类化...

    iOS 下拉、右拉更新界面

    避免在主线程上进行耗时的操作,使用GCD或`NSOperationQueue`进行异步加载。同时,合理使用缓存和分页加载策略,减少网络请求和内存消耗。 6. **设计原则**: 设计下拉和右拉更新时,应遵循Apple的人机交互指南,...

Global site tag (gtag.js) - Google Analytics