Difference between revisions of "ActorKit.framework"

From iPhone Development Wiki
Jump to: navigation, search
(Undo revision 4902 by Testatest (talk))
 
Line 1: Line 1:
The NSAutoreleasePool class is a thin wrapper around the '''NSPushAutoreleasePool''' and '''NSPopAutoreleasePool''' functions.
+
{{infobox Framework
 +
| vis = Private
 +
| since = 3.0
 +
| classID = AK
 +
}}
 +
<small>'''Languages: English &bull; [[ActorKit.framework/fr|français]]'''</small>
 +
 
 +
'''ActorKit''' is Apple's Objective-C-based implementation for [http://en.wikipedia.org/wiki/Actor_model Action-oriented programming].
 +
 
 +
It is used in [[DataAccess.framework]], [[Message.framework]] and [[searchd]].
 +
 
 +
== Example usage ==
  
 
<source lang="objc">
 
<source lang="objc">
#ifdef __cplusplus
+
#import <ActorKit/ActorKit.h>
extern "C" {
+
 
#endif
+
// You must provide a protocol on the messages that the actor can receive.
void *NSPushAutoreleasePool(NSUInteger capacity);
+
@protocol SlowActor
void NSPopAutoreleasePool(void* token);
+
-(oneway void)doWorkWithConditionLock:(NSConditionLock*)lock;  // oneway is important here. Without it, calls will be synchronous.
#ifdef __cplusplus
+
@end
 +
 
 +
 
 +
@interface SlowActor : AKActor<SlowActor> {
 +
  int actor_id;
 +
}
 +
-(id)initWithID:(int)_id;
 +
-(oneway void)doWorkWithConditionLock:(NSConditionLock*)lock;
 +
@end
 +
 
 +
 
 +
@implementation SlowActor
 +
-(id)initWithID:(int)_id {
 +
  if ((self = [super init]))
 +
    actor_id = _id;
 +
  return self;
 +
}
 +
-(oneway void)doWorkWithConditionLock:(NSConditionLock*)lock; {
 +
  printf("Worker %d is doing work...\n", actor_id);
 +
  usleep(actor_id*actor_id*100000);
 +
  [lock lock];
 +
  [lock unlockWithCondition:[lock condition]+1];
 +
  printf("Worker %d has done.\n", actor_id);
 
}
 
}
#endif
+
@end
</source>
+
 
 +
 
  
Example:
+
int main () {
 +
  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
 +
 
 +
  SlowActor* actors[10];
 +
  for (unsigned i = 0; i < 10; ++ i)  {
 +
    actors[i] = [[[SlowActor alloc] initWithID:i] autorelease];
 +
    // You must call -startThreadDispatchQueue before sending any works to the actors.
 +
    [actors[i] startThreadDispatchQueue];
 +
  }
 +
   
 +
  NSConditionLock* lock = [[NSConditionLock alloc] initWithCondition:0];
 +
 
 +
  for (unsigned i = 0; i < 10; ++ i)
 +
    // Use -send to obtain the actor's mailbox. Send messages to their mailboxes to allow asynchronous messages.
 +
    [[actors[i] send] doWorkWithConditionLock:lock];
 +
 
 +
  printf("Waiting for all workers...\n");
 +
 
 +
  [lock lockWhenCondition:10];
 +
  [lock unlock];
 +
 
 +
  printf("All workers done...\n");
  
<source lang="objc">
+
  [pool drain];
static void MyMethod()
+
 
{
+
  return 0;
    void *pool = NSPushAutoreleasePool(0);
 
    [[[NSObject alloc] init] autorelease];
 
    NSPopAutoreleasePool(pool);
 
 
}
 
}
 
</source>
 
</source>
  
The "capacity" argument of NSPushAutoreleasePool only serves as a hint. It is unused in the current implementation.
+
== Reference ==
 +
* http://github.com/kennytm/iphone-private-frameworks/tree/master/ActorKit/
 +
 
 +
 
  
{{occlass|library=Foundation.framework}}
+
{{Navbox Frameworks}}
 +
[[Category:Frameworks/Private]]

Latest revision as of 09:41, 2 February 2017

ActorKit.framework
Private Framework
Availabile 3.0 – present
Class Prefix AK

Languages: English • français

ActorKit is Apple's Objective-C-based implementation for Action-oriented programming.

It is used in DataAccess.framework, Message.framework and searchd.

Example usage

#import <ActorKit/ActorKit.h>

// You must provide a protocol on the messages that the actor can receive.
@protocol SlowActor
-(oneway void)doWorkWithConditionLock:(NSConditionLock*)lock;  // oneway is important here. Without it, calls will be synchronous.
@end


@interface SlowActor : AKActor<SlowActor> {
  int actor_id;
}
-(id)initWithID:(int)_id;
-(oneway void)doWorkWithConditionLock:(NSConditionLock*)lock;
@end


@implementation SlowActor
-(id)initWithID:(int)_id {
  if ((self = [super init]))
    actor_id = _id;
  return self;
}
-(oneway void)doWorkWithConditionLock:(NSConditionLock*)lock; {
  printf("Worker %d is doing work...\n", actor_id);
  usleep(actor_id*actor_id*100000);
  [lock lock];
  [lock unlockWithCondition:[lock condition]+1];
  printf("Worker %d has done.\n", actor_id);
}
@end



int main () {
  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
  
  SlowActor* actors[10];
  for (unsigned i = 0; i < 10; ++ i)  {
    actors[i] = [[[SlowActor alloc] initWithID:i] autorelease];
    // You must call -startThreadDispatchQueue before sending any works to the actors.
    [actors[i] startThreadDispatchQueue];
  }
    
  NSConditionLock* lock = [[NSConditionLock alloc] initWithCondition:0];
  
  for (unsigned i = 0; i < 10; ++ i)
    // Use -send to obtain the actor's mailbox. Send messages to their mailboxes to allow asynchronous messages.
    [[actors[i] send] doWorkWithConditionLock:lock];
  
  printf("Waiting for all workers...\n");
  
  [lock lockWhenCondition:10];
  [lock unlock];
  
  printf("All workers done...\n");

  [pool drain];
  
  return 0;
}

Reference