블록에 대한 요구 사항은 시스템에 대한 요구 사항과 동일합니다.
내가 말했듯이, 몇 가지 접근법이 있습니다. 함수 포인터는 최소한의 상용구가 필요하지만 호출자의 컨텍스트를 전달하려면 추가 인수가 필요합니다 (self
내용). 펑터 및 멤버와의 포인터는 일반적으로 템플릿 기계가 작동하도록 요구합니다.
//Let's define a callback datatype
typedef void (*ResourceLoadObjFuncPtr)(void *, void*);
//argument 1 is ptr to ResourceLoadDescriptor, argument 2 is iconSlot, whatever it is
//Function that implements that type:
void MyLoad(void *img, void *iconSlot)
{
UIImage* img2 = (UIImage*)img;
UIImageView* iv = [[UIImageView alloc] initWithImage:img2];
iv.backgroundColor = [UIColor clearColor];
[(TheTypeOfIconslot*)iconSlot addSubview:iv];
iconLoaded(iv);
[iv release];
}
을 그리고 대신 ResourceLoadObjCBlockCB
의 ResourceLoadObjFuncPtr
매개 변수를 받아 queueLoadImageWithBlock
의 프로토 타입을 수정해야 할 것, 단지 iconSlot
의 컨텍스트 (또 다른 매개 변수 : 함수 포인터 그래서, 여기 갈 것입니다 방법 우리의 경우).
그리고 호출 :
[[GameViewController getInstance] getResourceLoadMediator]->
queueLoadImageWithFunction([self.url UTF8String], MyLoad, self.iconSlot);
블록은 폐쇄가
- 그들이 선언하고 함수의 변수를 캡처합니다. C++은 iOS에서 GCC가 지원하는 폐쇄를 제공하지 않습니다 (블록 제외). 따라서 변수를 함수 범위에서 함수 매개 변수로 직접 전달해야합니다. 우리의 경우, 제 가정이 옳다면, 단지 하나의 변수 만 있습니다; 보다 복잡한 경우에는 구조체에 랩핑하고 포인터를 포인터에 전달해야합니다.
대체 방법으로는 추상 기본 클래스와 해당 생성자를 통해 컨텍스트를 캡처하는 구체적인 구현을 사용하는 것입니다. 이 같이 갈 것 :
//Callback type
class ResourceLoader
{
public:
virtual void Load(void *) = 0;
};
//A callback implementation - not a function, but a class
class MyResourceLoader : public ResourceLoader
{
IconSlotType *iconSlot;
void Load(void *img)
{
//Same loader stuff as above
}
public:
MyResourceLoader(IconSlotType *isl)
:iconSlot(isl)
{}
};
queueLoadImageWithBlock
해당하는 지금 형 ResourceLoader*
의 두 번째 매개 변수없이 세 번째 매개 변수를 취할 것입니다. 호출에 관해서는 콜백 객체 수명 문제가 있습니다. queueLoadImageWithBlock
비동기식입니까? 즉, 콜백 호출 전에 반환됩니까? 그렇다면 MyResourceLoader의 로컬 인스턴스는 수행하지 않으며 동적으로 인스턴스를 만들어야합니다. 이 동기의 가정 (..이 반환 한 후 즉하면 콜백을 호출하지 않음) :
MyResourceLoader ResLoader(self.iconSlot);
[[GameViewController getInstance] getResourceLoadMediator]->
queueLoadImageWithLoader([self.url UTF8String], &ResLoader);
를 그렇지 않은 경우
이
[[GameViewController getInstance] getResourceLoadMediator]->
queueLoadImageWithLoader([self.url UTF8String], new MyResourceLoader(self.iconSlot));
C++ 세계는 어떤 종류의 인터페이스를 제공합니까? C++에는 "canned function"이라는 개념을 구현하는 세 가지 구문이 있습니다. 포인터, 멤버, 펑터 및 C 스타일 함수 포인터가 있습니다. 어떤 Cocos2dx API가 기대하는 것입니까? –
그것은 C++ 스타일 함수 포인터이거나 위의 코드 스 니펫에 가까운 것이어야합니다. – user1908860
'queueLoadImageWithBlock()'이 시스템에서 제공되고 있습니까? 그렇다면 두 번째 매개 변수의 유형은 무엇입니까? 블록이라면 함수 포인터로 만족시킬 방법이 없습니다. 그들은 단지 동등하지 않습니다. –