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是一种强大的、灵活的代码封装机制,它允许我们定义并存储一段可执行的代码,可以在需要的时候调用。Blocks是Objective-C的语法扩展,后来也被引入到Swift中,对于处理异步操作、事件回调、简化...
在iOS开发中,Block是一种强大的编程工具,它允许我们在代码中定义匿名函数或者闭包,使得函数能够作为参数传递,也可以直接在其他函数内部定义和使用。熟练掌握Block的使用对于提升iOS应用的代码质量、可读性和效率...
"ios-block 回调.zip"中的"CallbackDemo"很可能是展示了一个关于如何在iOS应用中使用Block进行回调的实例。 Block的基本结构由`^`符号开启,后面跟着返回类型(如果有的话),接着是参数列表,最后用`{}`包裹实现的...
例如,一个无参数、无返回值的Block定义如下: ```objc void (^myBlock)() = ^{ NSLog(@"这是Block内部的代码"); }; ``` ### 2. Block的类型 Block有三种类型:全局Block、栈Block和堆Block。全局Block存储在...
例如,一个简单的Block定义可能如下所示: ```objc int (^myBlock)(int) = ^(int num) { return num * 2; }; ``` Block分为三种类型:全局Block、栈Block和堆Block,这取决于它们的存储位置。栈Block在执行完后会...
但是栈上的Block不能被其他线程访问,也不能在异步操作中使用。 2. **堆存储(Heap Block)**:如果Block引用了外部对象,编译器会将其存储在堆上,并且需要手动管理内存(使用`copy`属性或者`__strong`关键字)。...
我们可以用Block定义任务,然后将其提交到不同的队列中执行。主队列是同步的,而全局队列和自定义队列通常是异步的,这使得Block反向传值成为可能。 总结: Block反向传值是iOS开发中一种常见的技术,用于在异步...
在iOS开发中,Block是一种强大的语法特性,它允许我们在代码中定义匿名函数或者闭包,可以作为参数传递、返回值,甚至可以作为属性存储。在这个“ios-把block当成属性放在全局字典中的用例.zip”示例中,开发者创建...
在iOS开发中,Block是一种强大的编程工具,它允许我们在代码中定义可执行的代码块,类似于函数,但可以在运行时动态地使用。本教程将深入探讨如何将Block用作对象属性以及作为返回值来增强代码的灵活性和可读性。 ...
在这个名为"ios-block逆传值页面间的.zip"的资源中,我们主要关注的是如何使用Block来实现页面间的反向传值。Block是Objective-C和Swift中的一种强大的特性,它可以作为参数传递,也可以作为返回值。对于初学者来说...
在iOS开发中,Block常与Grand Central Dispatch (GCD)结合使用,实现多线程编程。通过Block,我们可以方便地将任务提交到不同的调度队列,如主队列或并发队列,简化异步编程。 6. **Block与KVO**: Block还可以...
总之,"IOS block回调代码实例Demo"是一个很好的学习资源,它展示了如何在iOS应用中使用Block进行回调,这对于理解和掌握iOS开发中的异步编程至关重要。通过深入研究这个Demo,开发者可以更好地运用Block来优化代码...
在iOS开发中,Block和代理是两种常用的回调机制,它们都可以用来实现对象间的通信,但具体用法和特性有所差异。下面将详细讲解Block和代理的对比,以及它们各自的应用场景。 首先,Block是一种内联函数,它可以捕获...
在iOS开发中,Block是一种强大的特性,它允许你定义并存储一段可执行的代码,可以在需要的时候方便地调用。Block被苹果引入是为了提供一种更简洁、更灵活的方式来处理回调、异步操作以及复杂的逻辑控制。以下是关于...
1. Block定义:Block 是 Objective-C 对匿名函数的实现,它可以捕获和存储其所在作用域内的变量,包括局部变量和实例变量。Block 可以作为参数传递,也可以作为方法的返回值。 2. Block类型:主要有三种类型,根据...
接下来,我们将详细讨论如何在iOS中使用Block,包括作为局部变量、属性以及函数参数的用法。 1. **Block作为局部变量** 在函数或方法内部,我们可以声明并定义一个Block,将其作为局部变量。Block的定义通常以`^`...
Block是苹果在Cocoa Touch框架中引入的一种强大的闭包特性,它可以捕获和存储其定义范围内的局部变量,并可以在其他地方使用。Block可以作为函数参数,也可以返回Block。在iOS开发中,Block被广泛用于处理异步操作,...
2. **函数参数(Function Arguments)**:Block可以作为函数或方法的参数传递,这样可以在函数执行过程中使用Block定义的代码逻辑。 3. **静态变量(Static Variables)**:局部静态变量和全局静态变量在Block中...
本文将深入探讨如何在iOS中使用Block。 ### 一、Block定义 Block 是一种匿名函数,可以在代码中定义,无需预先声明。Block 的基本语法如下: ```objc ^return_type (parameter_list) { // Block 体 } ``` 例如...
在iOS开发中,Block是一种强大的特性,它允许我们在代码中定义可执行的代码块,类似于匿名函数。然而,如果不小心处理,Block可能会导致循环引用,从而引起内存泄漏问题。本资料包“ios-block循环引用的三种解决办法...