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); }];
相关推荐
苹果官方文档声明,block是objc对象。下面这篇文章主要给大家介绍了关于iOS中block的定义与使用,文中通过示例代码介绍的非常详细,对各位iOS开发者具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
Block封装了一段代码逻辑,也用{}括起,和标准C语言中的函数/函数指针很相似,此外就是blokc能够对定义环境中的变量可以引用到。这一点和其它各种语言中所说的“闭包”是非常类似的概念。在iOS中,block有很多应用...
先跟着我实现最简单的 Block 回调传参的使用,如果你能举一反三,基本上可以满足了 OC 中的开发需求。已经实现的同学可以跳到下一节。 首先解释一下我们例子要实现什么功能(其实是烂大街又最形象的例子): 有两个...
ios block的常用声明, 创建, 定义基本使用规则. 这里是老狼对苹果文档的官方翻译.
IOS 使用Block二次封装AFNetworking 3.0详解 现在我们网络请求大都用第三方工具—–AFNetworking; 其中,AFNetworking 3.0 是对 NSURLSession 进行的封装,简化了很多步骤,但是在现实开发中,我们可以将...
在iOS通过代理逆向传值的方式详解一文中,分析了如何利用代理模式来逆向传值,其实还有一些其他的方式,如通知、Block等,相比较代理,我个人认为反而要简单些,但是需要处理好细节问题,如Block循环引用。...
我们可以把Block当做Objective-C的匿名函数。Block允许开发者在两个对象之间将...当然,我们也可以把Block定义在-viewDidLoad方法外部,例如上面的代码块printNumBlock的定义,就在-viewDidLoad外面。 第二个viewcontr
在要传值得那个页面定义含有block参数的方法,即在第二个页面的.h文件中定义: 重新定义:typedef void (^ReturnTextBlock)(NSString *showText); //重新定义block类名 void返回值类型 ReturnT
Block的定义: int (^myBlock) (int a,int b) = ^(int a,int b){ return a+b; }; 定义了一个名为myBlock的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现,是不是有点像方法的定义...
(1)Block是OC中的一种数据类型,在iOS开发中被广泛使用 (2)^是Block的特有标记 (3)Block的实现代码包含在{}之间 (4)大多情况下,以内联inline函数的方式被定义和使用 (5)Block与C语言的函数指针有些相似,...
对UIAlertView进行简单的扩展封装,实用block块的方式回调用户的点击操作。定义了三种样式:普通提示框、不带取消按钮的提示框、带输入框的提示框。注释详尽,方便大家学习。
RadioCheckBox iOS 单选框,可自定义横向和纵向显示,可定义显示的个数和内容,自定义间距,提供block 和代理方法可供使用,欢迎拍砖!
工厂绅士 一个简单的库,可帮助定义在测试iOS / Mac应用程序时使用的模型工厂。 基于Ruby的 。问题我们在类SomeClass上进行了测试,该测试需要数据值对象User的实例。 该类仅使用username属性。 在测试中,即使我们...
定义连接类的静态方法 定义连接类的静态方法 定义连接类的静态方法
对常用的UI控件再次简化调用,配合Masonry自动布局,及block版本的事件响应回调,一句代码搞定! 对常用的Foundation库中的类添加分类,以减少崩溃的概率 对常用的控制器类的通用功能集成到基类中,如通知监听及...
我们都知道在防止如block的循环引用时,会使用__weak关键字做如下定义: __weak typeof(self) weakSelf = self; 后来,为了方便,不用每次都要写这样一句固定代码,我们定义了宏: #define WeakSelf __weak typeof...
下面主要用到的知识有MVC,iOS开发中的自动布局,自定义组件的封装与使用,Block回调,CoreData的使用。有的小伙伴可能会问写一个自定义表情键盘肿么这么麻烦?下面将会介绍我们如何用上面提到的东西来定义我们的表情...