开发者

Encoding an Objective-c Block?

开发者 https://www.devze.com 2022-12-18 21:21 出处:网络
Is it possible to encode an Objec开发者_StackOverflow社区tive-C block with an NSKeyedArchiver? I don\'t think a Block object is NSCoding-compliant, therefore [coder encodeObject:block forKey:@\"block

Is it possible to encode an Objec开发者_StackOverflow社区tive-C block with an NSKeyedArchiver?

I don't think a Block object is NSCoding-compliant, therefore [coder encodeObject:block forKey:@"block"] does not work?

Any ideas?


No, it isn't possible for a variety of reasons. The data contained within a block isn't represented in any way similar to, say, instance variables. There is no inventory of state and, thus, no way to enumerate the state for archival purposes.

Instead, I would suggest you create a simple class to hold your data, instances of which carry the state used by the blocks during processing and which can be easily archived.

You might find the answer to this question interesting. It is related.


To expand, say you had a class like:

@interface MyData:NSObject
{
    ... ivars representing work to be done in block
}

- (void) doYourMagicMan;
@end

Then you could:

MyData *myWorkUnit = [MyData new];

... set up myWorkUnit here ...

[something doSomethingWithBlockCallback: ^{ [myWorkUnit doYourMagicMan]; }];

[myWorkUnit release]; // the block will retain it (callback *must* Block_copy() the block)

From there, you could implement archiving on MyData, save it away, etc... The key is treat the Block as the trigger for doing the computation and encapsulate said computation and the computation's necessary state into the instance of the MyData class.

0

精彩评论

暂无评论...
验证码 换一张
取 消