Hydra 1.4.0

Hydra 1.4.0

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最新发行2019年11月

Tae Hyun Na 维护。



Hydra 1.4.0

  • 作者
  • Tae Hyun Na

Hydra

Version License Platform

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. 当所有注册的任务在这些初始化完成后完成时。
  2. 当所有注册的任务在情况(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