2014-03-25 5 views
0

오류가 발생합니다. instance method '-callDelegateOnMainThread:withArg:error:' not found 여기서 어떻게해야합니까? Ray Wenderlichs의 멀티 플레이어 코드 기반 업적 코드를 병합했습니다. 이것이 당신이 찾고있는 누락 된 코드처럼 여기인스턴스 메소드를 찾을 수 없습니다. callDelegateOnMainThread

@interface GCTurnBasedMatchHelper : NSObject <GKTurnBasedMatchmakerViewControllerDelegate, GKTurnBasedEventHandlerDelegate, GKAchievementViewControllerDelegate, MFMessageComposeViewControllerDelegate> { 
    BOOL gameCenterAvailable; 
    BOOL userAuthenticated; 
    UIViewController *presentingViewController; 
    NSMutableDictionary* earnedAchievementCache; 
    GKTurnBasedMatch *currentMatch; 
    //id <GCTurnBasedMatchHelperDelegate> delegate; 
} 

- (void) submitAchievement: (NSString*) identifier percentComplete: (double) percentComplete 
{ 
    //GameCenter check for duplicate achievements when the achievement is submitted, but if you only want to report 
    // new achievements to the user, then you need to check if it's been earned 
    // before you submit. Otherwise you'll end up with a race condition between loadAchievementsWithCompletionHandler 
    // and reportAchievementWithCompletionHandler. To avoid this, we fetch the current achievement list once, 
    // then cache it and keep it updated with any new achievements. 
    if(self.earnedAchievementCache == NULL) 
    { 
     [GKAchievement loadAchievementsWithCompletionHandler: ^(NSArray *scores, NSError *error) 
     { 
      if(error == NULL) 
      { 
       NSMutableDictionary* tempCache = [NSMutableDictionary dictionaryWithCapacity: [scores count]]; 
       for (GKAchievement* score in scores) 
       { 
        [tempCache setObject: score forKey: score.identifier]; 
       } 
       self.earnedAchievementCache = tempCache; 
       [self submitAchievement: identifier percentComplete: percentComplete]; 
      } 
      else 
      { 
       //Something broke loading the achievement list. Error out, and we'll try again the next time achievements submit. 
       [self callDelegateOnMainThread: @selector(achievementSubmitted:error:) withArg: NULL error: error]; 
      } 

     }]; 
    } 
    else 
    { 
     //Search the list for the ID we're using... 
     GKAchievement* achievement = [self.earnedAchievementCache objectForKey: identifier]; 
     if(achievement != NULL) 
     { 
      if((achievement.percentComplete >= 100.0) || (achievement.percentComplete >= percentComplete)) 
      { 
       //Achievement has already been earned so we're done. 
       achievement= NULL; 
      } 
      achievement.percentComplete= percentComplete; 
     } 
     else 
     { 
      achievement = [[[GKAchievement alloc] initWithIdentifier: identifier] autorelease]; 
      achievement.percentComplete= percentComplete; 
      //Add achievement to achievement cache... 
      [self.earnedAchievementCache setObject: achievement forKey: achievement.identifier]; 
     } 
     if(achievement != NULL) 
     { 
      //Submit the Achievement... 
      [achievement reportAchievementWithCompletionHandler: ^(NSError *error) 
      { 
       [self callDelegateOnMainThread: @selector(achievementSubmitted:error:) withArg: achievement error: error]; 
      }]; 
     } 
    } 
} 


- (void) achievementSubmitted: (GKAchievement*) ach error:(NSError*) error; 
{ 
    if((error == NULL) && (ach != NULL)) 
    { 
     if (ach.percentComplete == 100.0) { 
      //UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Achievement Earned!" 
      //      message:(@"%@",ach.identifier) 
      //      delegate:nil 
      //      cancelButtonTitle:@"OK" 
      //      otherButtonTitles:nil]; 
      //[alert show]; 
      //[alert release]; 
      TRACE("achievement submitted %s\n", [ach.identifier UTF8String]); 
     } 
    } 
    else 
    { 
     // Achievement Submission Failed. 
     printf("Achievement Submission Failed\n"); 
    } 
} 

답변

2

이 보이는 기능은 다음과 같습니다

기능은 다음과 같은 인터페이스의 일부입니다. 그냥 GCTurnBasedMatchHelper.m 파일 안에 넣으십시오.

- (void) callDelegateOnMainThread: (SEL) selector withArg: (id) arg error: (NSError*) err 
{ 
    dispatch_async(dispatch_get_main_queue(), ^(void) 
        { 
         [self callDelegate: selector withArg: arg error: err]; 
        }); 
} 

- (void) callDelegate: (SEL) selector withArg: (id) arg error: (NSError*) err 
{ 
    assert([NSThread isMainThread]); 
    if([delegate respondsToSelector: selector]) 
    { 
     if(arg != NULL) 
     { 
      [delegate performSelector: selector withObject: arg withObject: err]; 
     } 
     else 
     { 
      [delegate performSelector: selector withObject: err]; 
     } 
    } 
    else 
    { 
     NSLog(@"Missed Method"); 
    } 
} 
+0

음, callDelegateOnMainThread가 누락 된 경우 callDelegate도 누락 된 것 같지 않습니다. :-)하지만 네, 오류 메시지 inidcates 정확히. –

+0

위의 callDelegate가 추가되었습니다. – vincentjames501

+0

감사합니다. 그냥 대리인을 자기 자신으로 바꿔야 만합니다. 나는 callDelegateOnMainThread가 무언가로부터 상속 받기를 기대하고 있었고 뭔가 잘못하고있었습니다. 그것은 나에게 결코 그것이 사용자 기능이라고 생각하지 않는다. – Rasterman

0

존재하지 않는 방법을 추가하기 만하면됩니다.