Hydra
Hydra 的目标是让开发者能够专注于重要的实现,而无需关注诸如后台任务、异步等复杂的事情。您需要做的就是将您的任务注册到 Hydra 框架中,框架将会在后台线程中执行您的任务。当您的任务完成时,Hydra 框架会调用您的回调处理程序。
安装
您可以从我们的发行页面上下载最新的框架文件。Hydra 也可通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 中:pod ‘Hydra’
设置
至少需要一个 HYWorker
模块。您可以通过从 HYworker
继承来创建工作模块。
@interface CommonWorker : HYWorker
将工作模块添加到 Hydra 并启动。就这样。
[[Hydra defaultHydra] addWorker:[[CommonWorker alloc] init]];
[[Hydra defaultHydra] startAllWorkers];
执行器
您的业务逻辑的大部分将位于 HYExecutor
类中。您可以通过从 HYExecutor
继承来创建执行器模块。
@interface SampleExecutor : HYExecutor
以下代码展示了如何在 HYExecutor
类下设置您的业务逻辑。
- (NSString *)name
{
return SampleExecutorName;
}
- (BOOL)calledExecutingWithQuery:(id)anQuery
{
// get parameter values
NSInteger a = [[anQuery parameterForKey:@“a”] integerValue];
NSInteger b = [[anQuery parameterForKey:@“b”] integerValue];
// prepare result
HYResult *result = [HYResult resultWithName:self.name];
[result setParameter:[NSNumber numberWithInteger:a+b] forKey:@“sum”];
// stored result will notify by result name
[self storeResult:result];
return YES;
}
进行查询并将结果推送至 Hydra
。
HYQuery *query = [HYQuery queryWithWorkerName:CommonWorker executorName:SampleExecutorName];
[query setParameter:[NSNumber numberWithInteger:1] forKey:@“a”];
[query setParameter:[NSNumber numberWithInteger:2] forKey:@“b”];
[[Hydra defaultHydra] pushQuery:query];
注册回调处理程序以获取您的任务结果。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(commonWorkerNotification:) name:CommonWorkerName object:nil];
- (void)commonWorkerNotification:(NSNotification *)notification
{
NSDictionary *userInfo = [notification userInfo];
HYResult *result = [userInfo objectForKey:SampleExecutorName];
if( result != nil ) {
NSInteger sum = [[result parameterForKey:@“sum”] integerValue];
NSLog( @“sum is %d”, sum );
}
}
管理器
一个辅助类,用于集中化管理一组相关执行器。您可以通过继承 HYManager
来创建管理器类。
@interface SampleManager : HYManager
- (void)requestSumOfA:(NSInteger)a andB:(NSInteger)b
{
HYQuery *query = [self queryForExecutorName:SampleExecutorName];
[query setParameter:[NSNumber numberWithInteger:a] forKey:@“a”];
[query setParameter:[NSNumber numberWithInteger:b] forKey:@“b”];
[[Hydra defaultHydra] pushQuery:query];
}
[[SampleManager defaultManager] requestSumOfA:1 andB:2];
以下示例展示了如何简单地添加通知回调处理程序。
[self registExecutor:[[SampleExecutor alloc] init] withWorkerName:SampleWorkerName action:@selector(sampleExecutorHandlerWithResult:)];
- (NSMutableDictionary *)sampleExecutorHandlerWithResult:(HYResult *)result
{
NSInteger sum = [[result parameterForKey:@“sum”] integerValue];
NSLog( @“sum is %d”, sum );
return nil;
}
此外,HYManager
还能以自己的名称发送通知。
- (NSString *)name
{
return SampleManagerNotification;
}
- (NSMutableDictionary *)sampleExecutorHandlerWithResult:(HYResult *)result
{
NSMutableDictionary *paramDict = [[NSMutableDictionary alloc] init];
NSNumber *sum = [result parameterForKey:@“sum”];
if( sum != nil ) {
[paramDict setObject:sum forKey:SampleManagerNotifyParameterKeySum];
}
if( [paramDict count] == 0 ) {
return nil;
}
// ‘paramDict’ will be ‘userInfo’ of notification ’SampleManagerNotification’.
return paramDict;
}
异步任务
您还可以使用 AsyncTask
类执行相互间并行运行的附加任务。因此,它允许在调用 bindAsyncTask:
方法执行 'AsyncTask' 后立即执行其他任务。
当 AsyncTask
完成其任务时,'calledExecutingWithQuery' 会被调用。因此,您应该知道,通过检查 anQuery
参数,'AsyncTask' 类已经完成了它的任务。以下代码展示了如何设置这个 anQuery
参数。
- (BOOL)calledExecutingWithQuery:(id)anQuery
{
// AsyncTask hasn't done it's job yet.
if( [[anQuery parameterForKey:SampleExecutorParameterKeyCloseQueryCall] boolValue] == NO ) {
[anQuery setParameter:@“Y” forKey:SampleExecutorParameterKeyCloseQueryCall];
SampleAsyncTask *sampleAsyncTask = [[SampleAsyncTask alloc] initWithCloseQuery:anQuery];
[self bindAsyncTask:sampleAsyncTask];
// AsyncTask has done it's job yet
} else {
NSLog( @“async task done” );
}
return YES;
}
跟踪结果集
当所有注册的任务在初始化后完成时,TrackingResultSet
非常方便。以下是可以获取通知的列表。
- 当所有注册的任务在这些初始化完成后完成时。
- 当所有注册的任务在情况(1)完成后完成时。
HYTrackingResultSet *trackingResultSet = [[HYTrackingResultSet alloc] initWithName:kTrackingResultNameForBooAndFooAllUpdated];
[trackingResultSet setResultNamesFromArray:[NSArray arrayWithObjects:BooExecutorName, FooExecutorName, nil]];
[[Hydra defaultHydra] setTrackingResultSet:trackingResultSet];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(booAndFooAllUpdated:) name:kTrackingResultNameForBooAndFooAllUpdated object:nil];
迁移模块
您的应用程序可能需要进行多次更新。有时,您的用户需要更新他们的本地数据以匹配最新版本。您可以通过继承 HYMigrator
来轻松管理此迁移模块。
@interface SampleMigrator : HYMigrator
- (BOOL)doInitialing
{
// do something when first initialing task at once
return YES;
}
+ (NSUInteger)suggestedMigrationNumber
{
// set last version number of migration to 5 for example.
return 5;
}
- (BOOL)isSomethingToDoForMigrationNumber:(NSUInteger)migrationNumber
{
// check migration number and do some task for given migration number.
// if something to do for given migration number then return YES, or if not return NO.
return YES;
}
- (BOOL)doMigrationForNumber:(NSUInteger)migrationNumber
{
// if you return YES at method 'isSomethingToDoForMigrationNumber:' for given number then,
// this method called for do migration task.
// implement your migration code for given number here.
return YES;
}
SampleMigrator *migrator = [[SampleMigrator alloc] init];
[[Hydra defaultHydra] doMigration:migrator waitUntilDone:NO];
许可证
适用于的,署于MIT许可下。 http://en.wikipedia.org/wiki/MIT_License