`
jsntghf
  • 浏览: 2476205 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

iOS中block的定义及使用

    博客分类:
  • iOS
阅读更多

1、定义

 

2、使用示例

(1)Downloader.h

#import <Foundation/Foundation.h>

typedef void (^SOLWeatherDataDownloadCompletion)(NSDictionary *dic, NSError *error);

@interface Downloader : NSObject

+ (instancetype)sharedDownloader;
- (void)dataForUrl:(NSString *)requestURL completion:(SOLWeatherDataDownloadCompletion)completion;

@end

 

(2)Downloader.m

#import "Downloader.h"

@implementation Downloader

static Downloader *_sharedDownloader = nil;

+ (instancetype)sharedDownloader {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedDownloader = [[super allocWithZone:NULL] init];
    });
    
    return _sharedDownloader;
}

+ (id)allocWithZone:(struct _NSZone *)zone {
    return [Downloader sharedDownloader];
}

- (id)copyWithZone:(struct _NSZone *)zone {
    return [Downloader sharedDownloader];
}

- (void)dataForUrl:(NSString *)requestURL completion:(SOLWeatherDataDownloadCompletion)completion {
    if(!requestURL || !completion)
        return;
    
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:requestURL]];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:
     ^ (NSURLResponse *response, NSData *data, NSError *connectionError) {
         if(connectionError)
             completion(nil, connectionError);
         else {
             @try {
                 NSError *JSONSerializationError;
                 NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&JSONSerializationError];
                 completion(JSON, connectionError);
             }
             @catch (NSException *exception) {
                 completion(nil, [NSError errorWithDomain:@"Downloader Internal State Error" code:-1 userInfo:nil]);
             }
             @finally {
                 
             }
         }
     }];
}

@end

 

(3)调用示例

static NSString *baseURL =  @"http://api.wunderground.com/api/";
static NSString *parameters = @"/forecast/conditions/q/";
static NSString *APIKey = @"0def10027afaebb7";
NSString *requestURL = [NSString stringWithFormat:@"%@%@%@%f,%f.json", baseURL, APIKey, parameters, 39.897445, 116.331398];
[[Downloader sharedDownloader] dataForUrl:requestURL completion:^(NSDictionary *dic, NSError *error) {
    if (dic)
        NSLog(@"%@",dic);
}];

 

分享到:
评论

相关推荐

    iOS中block的定义与使用

    苹果官方文档声明,block是objc对象。下面这篇文章主要给大家介绍了关于iOS中block的定义与使用,文中通过示例代码介绍的非常详细,对各位iOS开发者具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    iOS中block变量捕获原理详析

    Block封装了一段代码逻辑,也用{}括起,和标准C语言中的函数/函数指针很相似,此外就是blokc能够对定义环境中的变量可以引用到。这一点和其它各种语言中所说的“闭包”是非常类似的概念。在iOS中,block有很多应用...

    iOS中Block的回调使用和解析详解

    先跟着我实现最简单的 Block 回调传参的使用,如果你能举一反三,基本上可以满足了 OC 中的开发需求。已经实现的同学可以跳到下一节。 首先解释一下我们例子要实现什么功能(其实是烂大街又最形象的例子): 有两个...

    iOS Block编程

    ios block的常用声明, 创建, 定义基本使用规则. 这里是老狼对苹果文档的官方翻译.

    IOS 使用Block二次封装AFNetworking 3.0详解

    IOS 使用Block二次封装AFNetworking 3.0详解 现在我们网络请求大都用第三方工具—–AFNetworking; 其中,AFNetworking 3.0 是对 NSURLSession 进行的封装,简化了很多步骤,但是在现实开发中,我们可以将...

    iOS利用Block逆向传值的方式详解

    在iOS通过代理逆向传值的方式详解一文中,分析了如何利用代理模式来逆向传值,其实还有一些其他的方式,如通知、Block等,相比较代理,我个人认为反而要简单些,但是需要处理好细节问题,如Block循环引用。...

    iOS中详解Block作为property属性实现页面之间传值

    我们可以把Block当做Objective-C的匿名函数。Block允许开发者在两个对象之间将...当然,我们也可以把Block定义在-viewDidLoad方法外部,例如上面的代码块printNumBlock的定义,就在-viewDidLoad外面。 第二个viewcontr

    iOS通过block在两个页面间传值的方法

    在要传值得那个页面定义含有block参数的方法,即在第二个页面的.h文件中定义: 重新定义:typedef void (^ReturnTextBlock)(NSString *showText); //重新定义block类名 void返回值类型 ReturnT

    浅谈iOS 对于block的一点理解

    Block的定义: int (^myBlock) (int a,int b) = ^(int a,int b){ return a+b; };  定义了一个名为myBlock的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现,是不是有点像方法的定义...

    iOS Block解开多年以来一直的误解

     (1)Block是OC中的一种数据类型,在iOS开发中被广泛使用  (2)^是Block的特有标记  (3)Block的实现代码包含在{}之间  (4)大多情况下,以内联inline函数的方式被定义和使用  (5)Block与C语言的函数指针有些相似,...

    ios-自定义实用Alert提示框(Block回调).zip

    对UIAlertView进行简单的扩展封装,实用block块的方式回调用户的点击操作。定义了三种样式:普通提示框、不带取消按钮的提示框、带输入框的提示框。注释详尽,方便大家学习。

    RadioCheckBox:iOS 单选框,可自定义横向和纵向显示,可定义显示的个数和内容,自定义间距,提供block 和代理方法可供使用,欢迎拍砖!

    RadioCheckBox iOS 单选框,可自定义横向和纵向显示,可定义显示的个数和内容,自定义间距,提供block 和代理方法可供使用,欢迎拍砖!

    FactoryGentleman:一个简单的库,可帮助定义模型工厂以在测试iOSMac应用程序时使用

    工厂绅士 一个简单的库,可帮助定义在测试iOS / Mac应用程序时使用的模型工厂。 基于Ruby的 。问题我们在类SomeClass上进行了测试,该测试需要数据值对象User的实例。 该类仅使用username属性。 在测试中,即使我们...

    定义连接类的静态方法

    定义连接类的静态方法 定义连接类的静态方法 定义连接类的静态方法

    ios-开源简化开发项目HYBHelperKit.zip

    对常用的UI控件再次简化调用,配合Masonry自动布局,及block版本的事件响应回调,一句代码搞定! 对常用的Foundation库中的类添加分类,以减少崩溃的概率 对常用的控制器类的通用功能集成到基类中,如通知监听及...

    iOS开发技巧之WeakSelf宏的进化详解

    我们都知道在防止如block的循环引用时,会使用__weak关键字做如下定义: __weak typeof(self) weakSelf = self; 后来,为了方便,不用每次都要写这样一句固定代码,我们定义了宏: #define WeakSelf __weak typeof...

    iOS开发之自定义表情键盘(组件封装与自动布局)

    下面主要用到的知识有MVC,iOS开发中的自动布局,自定义组件的封装与使用,Block回调,CoreData的使用。有的小伙伴可能会问写一个自定义表情键盘肿么这么麻烦?下面将会介绍我们如何用上面提到的东西来定义我们的表情...

Global site tag (gtag.js) - Google Analytics