2013-11-23 1 views
3

MediaFile이라는 PFObject 하위 클래스가 있습니다. 서버에 호출에서 내 서브 클래스의 인스턴스를 다시 얻기 위해, 나는 당신이이 같은 구문 분석 서브 클래스에서 쿼리를 만들 수있는 방법을 본 적이 :구문 : PFCloud 호출로 PFObject 하위 클래스 사용

PFQuery *query = [MediaFile query]; 
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { ... }]; 

그러나, 내 응용 프로그램에서 서버 호출의 대부분은 사용자 정의입니다 클라우드 호출은 PFObject를 반환합니다. 이러한 객체를 가져 오자 마자 MediaFile 객체로 처리하고 MediaFile 클래스에 정의 된 사용자 정의 메서드를 호출하려고합니다. 전송은 실제로 MediaFile 객체를 구성하지 않기 때문에 작동하지 않습니다. 내가이 문제를 극복하기 위해했던 것은 내가 다시 [MediaFile object]를 사용하여 얻을 각 PFObject 새로운 MediaFiles로를 구성하고, 나는이 loadFromObject:라고 쓴 방법을 사용하여 각 하나에 모든 데이터를 복사 MediaFile.m에서

[PFCloud callFunctionInBackground:@"func" withParameters:@{} block:^(id objects, NSError *error) { 

    for (PFObject *object in objects) { 

    MediaFile *mf = [[MediaFile object] loadFromObject:object]; 

    [array addObject:mf]; 
    } 
}]; 

을 :

- (MediaFile *) loadFromObject:(PFObject *)object { 
    NSArray *keys = [object allKeys]; 

    for (NSString *key in keys) { 
    id obj = [object objectForKey:key]; 
    [self setObject:obj forKey:key]; 
    } 

    return self; 
} 

이 작동하지만,이 문제를 해결하기 위해 더 우아한 방법이?

답변

1

사용자 정의 클래스는 어떻게 정의됩니까? 서브 클래 싱 메커니즘이 KVC (Key-Value-Coding)에 의존하기 때문입니다. 여기에 KVC Programming Guide이 있습니다. 또는 here 이상의 가이드를 확인할 수 있습니다.

다음 샘플은 작동합니다. 헤더에서


:

@interface CustomObject : PFObject <PFSubclassing> 

@property (nonatomic, strong) NSString *propertyName; 

구현에서 :

#import <Parse/PFObject+Subclass.h> 

#pragma mark - columns of Parse table 
@dynamic propertyName; 

#pragma mark - regiester parse subclass in runtime 
+ (void)load { 
    @autoreleasepool { 
     [self registerSubclass]; 
    } 
} 

#pragma mark - parse cloud table name 
+ (NSString *)parseClassName 
{ 
    return @"CustomObject"; // table name 
} 
0

그것은 결국 간단합니다. 나를 위해 일한 것은 반환 된 PFObjectPFObject의 Objective-C 하위 클래스에 할당하는 간단한 작업입니다. 따라서 귀하의 경우,

[PFCloud callFunctionInBackground:@"func" withParameters:@{} block:^(id objects, NSError *error) { 

    for (PFObject *object in objects) { 

    MediaFile *mf = object; // simple as that 

    [array addObject:mf]; 
    } 
}]; 
1

TL; DR은 : 는 클라우드 코드가 인터넷 전화에서 해당 개체를 반환하는 시간 확인 PFObject의 서브 클래스는 구문 분석에 등록되어 있는지 확인합니다. 당신이 the instructions Parse includes in it's documentation guide를 사용 PFObject를 서브 클래 싱 한 경우

, 당신은 당신의 사용자 정의 서브 클래스 반환하는 최초의 인터넷 전화하기 전에 다음 전화를 걸 수 있습니다 :

CustomSubclass.initialize()

이 코드를 추가하는 좋은 장소에 당신의 응용 프로그램 대리인의 application(didFinishLaunchingWithOptions:) 메서드는 하위 클래스와 관련된 다른 코드보다 먼저 실행될 가능성이 높습니다. 설명

내 상황에


롱 버전은 당신의 조금 다른,하지만 나는 문제가 거의 동일합니다 생각합니다. 내 문제는 내가 PFQuery을 통해 객체를 가져 왔고 쿼리 콜백에 반환 된 객체가 일반 PFObject이었습니다.의도 한대로, 명확하게이 클래스 Scene이 될하기로했다 밝혔다 설명과 함께 디버거에서 인쇄 것 results 배열의

// Scene is a PFObject subclass func getLatestScenes(completion: ((scenes: [Scene]) -> Void)?) { var query = PFQuery(className: SceneClassName) query.findObjectsInBackgroundWithBlock { (results: [AnyObject]?, error: NSError?) -> Void in if let scenes = results as? [Scene] { // This would never run, as the members of `results` were only PFObjects completion?(scenes: scenes) } else { // Code would always skip to the empty result case completion?(scenes: []) } } }

개인 회원 :

여기에 내 코드가 어떻게 생겼는지입니다 , 그러나 검사했을 때 그들은 단지 PFObject이었다. 여기

(lldb) po results![0] <Scene: 0x7fc743a8f310, objectId: YyxYH9dtBp, localId: (null)> { creator = "<PFUser: 0x7fc74144b320, objectId: FV3cmDI1PW>"; sceneDataFile = "<PFFile: 0x7fc743a96920>"; } (lldb) p results![0] (PFObject) $R6 = 0x00007fc743a8f310 { NSObject = { isa = 0x00007fc743a8f310 } ... // Info on object... ... }

문제는 Scene 객체가 제대로 PFObject 서브 클래스로 구문 분석에 등록되지 않은 것이 었습니다. initialize 방법은 올바르게과 같이 대체되었다

override class func initialize() { struct Static { static var onceToken : dispatch_once_t = 0; } dispatch_once(&Static.onceToken) { self.registerSubclass() } }

하지만 initalize 기능은 쿼리가 호출 된 시간에 호출되는되지 않았습니다. 문제는 클래스의 initialize 메서드가 첫 번째 메시지가 해당 클래스로 전송되기 바로 전에 호출되었지만 쿼리가 수행되기 전에 Scene에 메시지가 전송되지 않았기 때문입니다. 내 AppDelegate에의 application(didFinishLaunchingWithOptions:)에 다음 줄을 추가하면 문제를 그 후

Scene.initialize()

를 해결, 구문 분석은 입력 데이터 객체가 있어야 클라이언트에있는 클래스 추론 할 수 있었다, 그 클래스와 결과 배열을 건설했다.

관련 문제