No edit summary |
|||
Line 1: | Line 1: | ||
{{infobox Framework | |||
| vis = Private | |||
| since = 3.0 | |||
| classID = AK | |||
}} | |||
<small>'''Languages: English • [[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"> | ||
# | #import <ActorKit/ActorKit.h> | ||
// You must provide a protocol on the messages that the actor can receive. | |||
void * | @protocol SlowActor | ||
void | -(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; | |||
} | } | ||
</source> | </source> | ||
== Reference == | |||
* http://github.com/kennytm/iphone-private-frameworks/tree/master/ActorKit/ | |||
{{ | {{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 |
Headers | [headers.cynder.me] |
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