NSKeyedArchiver
인 Objective-C 블록을 인코딩 할 수 있습니까?Objective-c 블록 인코딩?
차단 개체가 NSCoding
- 준수라고 생각하지 않으므로 [coder encodeObject:block forKey:@"block"]
이 작동하지 않습니까?
아이디어가 있으십니까?
NSKeyedArchiver
인 Objective-C 블록을 인코딩 할 수 있습니까?Objective-c 블록 인코딩?
차단 개체가 NSCoding
- 준수라고 생각하지 않으므로 [coder encodeObject:block forKey:@"block"]
이 작동하지 않습니까?
아이디어가 있으십니까?
아니요, 여러 가지 이유로 불가능합니다. 블록 내에 포함 된 데이터는 인스턴스 변수와 어떤 식 으로든 표현되지 않습니다. 국가의 목록이 없기 때문에 보관 목적으로 국가를 열거 할 방법이 없습니다.
대신 데이터를 보관할 간단한 클래스를 만들고 처리 중에 블록에서 사용되는 상태를 쉽게 보관할 수있는 인스턴스를 제안하는 것이 좋습니다.
이 question interesting에 대한 답변을 찾을 수 있습니다. 그것은 관련되어 있습니다. 그런 다음 수
@interface MyData:NSObject
{
... ivars representing work to be done in block
}
- (void) doYourMagicMan;
@end
:
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)
여기에서, 당신은 그것을 멀리 저장을 MyData에 보관을 구현할 수있는 등 확장하려면
, 당신은 같은 클래스를 가지고 말 ... 키는 블록을 계산을 수행하기위한 방아쇠로 취급하고 계산 및 계산의 필요한 상태를 MyData 클래스의 인스턴스에 캡슐화합니다.
대답 해 주셔서 감사합니다. 왜 단순히 인코딩하는 것이 쉽지 않은지 이해합니다. 그러나 블록을 사용하는 상태를 유지하기 위해 클래스를 사용하라는 제안에 대해 혼란스러워합니다. 구현 방법을 확장 할 수 있습니까? 제 상황에서는 기본 void 콜백 블록, 즉 void^{do_stuff; }. 감사합니다. – rebo
블록은 인스턴스 변수가 될 수 있지만 _ un/archived 할 수는 없습니다. 반 직관적으로 말하면, 제말은. 내가 유일한 방법이라고 생각할 수있는 경고와 함께 유일한 대답 인 것을 상향 투표했다. 어쨌든, 어디 선가. –
@alexgray 많은 양의 객체는 보관/보관 해제 할 수없는 인스턴스 변수 (NSCopying을 지원하지 않는 모든 클래스) 일 수 있습니다. 블록이 보관 가능하다는 것은 무슨 의미일까요? 캡처 된 모든 객체도 보관 가능해야합니까? 랜덤 구조체를 포착하면 어떨까요? 그것도 보관해야합니까? 아키텍처/엔디안 종속성은 어떻습니까? 그것들은 아카이버 API에 의해 자동으로 처리됩니다. 블록이 맞춤 보관 기능을 구현할 능력을 키워야합니까? 유지해야 할 악몽을 넘어서는 '키트'(ROI는 거의 없음)에서 지원하기가 매우 어려울 것입니다. – bbum