2011-02-10 22 views
5

Web sunucu api'imi çağırmak için Restkit ile çalışmaya çalışıyorum ama işler çalışmıyor. Denetleyicim sadece etkinlik göstergesini gösterir ve hiçbir şey olmuyor.Three20 Entegrasyonu ile RestKit

Ben örneğin, üst 50 videoları bulur varsayalım bir API çağrısı var: http://example.com/services/getTop50Video

dönüş biçiminde geçerli:

<results> 
<mysql_host>72.9.41.97</mysql_host> 
<results>   
    <title/> 
    <views/> 
    <video_id>j2xFxHgENt4</video_id> 
    <thumbnail>http://img.youtube.com/vi/j2xFxHgENt4/2.jpg</thumbnail> 
    <url/> 
</results> 
... 
</results> 

My App temsilci Kod:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    // Configure RestKit Object Manager 
    RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:@"http://example.com/services"]; 

    RKObjectMapper* mapper = objectManager.mapper; 
    [mapper registerClass:[YouTubeVideo class] forElementNamed:@"video"]; 

    // Other non relevant stuff 
} 

TWYouTubeVideo Class:

@implementation TWYouTubeVideo 

@synthesize title = _title; 
@synthesize numberOfViews = _numberOfViews; 
@synthesize videoID = _videoID; 
@synthesize thumbnailURL = _thumbnailURL; 


+ (NSDictionary*)elementToPropertyMappings { 
    return [NSDictionary dictionaryWithKeysAndObjects: 
      @"title", @"title", 
      @"views", @"numberOfViews", 
      @"video_id", @"videoID", 
      @"thumbnail", @"thumbnailURL", 
      nil]; 
} 

My Denetleyici kodu:

-(id) initWithResourcePath:(NSString*) requestedResourcePath 
{ 
    if (self = [super init]) 
    { 
     self.resourcePath = requestedResourcePath; 
    } 
    return self; 
} 

- (void)createModel { 
    self.model = [[[RKRequestTTModel alloc] initWithResourcePath:self.resourcePath] autorelease]; 
} 


- (void)didLoadModel:(BOOL)firstTime { 
    [super didLoadModel:firstTime]; 

    RKRequestTTModel* model = (RKRequestTTModel*)self.model; 
    NSMutableArray* items = [NSMutableArray arrayWithCapacity:[model.objects count]]; 

     for (YouTubeVideo* video in model.objects) { 
      TableSubtitleItem *item = [TableSubtitleItem itemWithText:video.title 
                   subtitle:[NSString stringWithFormat:@"%@ views", video.numberOfViews] 
                   imageURL:video.thumbnailURL 
                  defaultImage:[YouTubeVideo defaultThumbnail] 
                     URL:nil 
                  accessoryURL:nil]; 

      [items addObject:item]; 
     } 


    // Ensure that the datasource's model is still the RKRequestTTModel; 
    // Otherwise isOutdated will not work. 
    TTListDataSource* dataSource = [TTListDataSource dataSourceWithItems:items]; 
    dataSource.model = model; 
    self.dataSource = dataSource; 
} 

Ve Kontrol iterek:

SecondYouTubeController* viewController = [[SecondYouTubeController alloc] initWithResourcePath:@"/getTop50VideoXML?json=true"]; 
[self.navigationController pushViewController:viewController animated:YES]; 
[viewController release];  

Birincisi, ben bir şekilde ayrıştırıcı anlatmak gerekiyor galiba o video nesneler bir "yanıt" düğümü içinde görünür. İkincisi, tüm çağrıları gerektiği gibi yaptığından emin değilim.

Burada yardımcı olmaktan memnuniyet duyarım.

cevap

2

RKRequestTTModel'inizdeki keyPath özelliğini "yanıtlar" olarak ayarlayarak "yanıtlar" öğesine inebilirsiniz.

Yanıtınız gerçekten XML mi? Şu anda RestKit XML yüklerini desteklemiyor (tekrar çalışmaya başlamak için yol haritası üzerindedir). JSON yükü alabilir misin? Değilse ve iyi dövüşte kavga etmek istiyorsanız, yapmanız gereken tek şey XML'i Kakao nesnelerine (Sözlükler ve Diziler) çevirebilen RKParser protokolünü uygulamaktır.

+0

RKRequestTTModel, Ana yol özelliği yok. başka bir nesneyi mi kastettin? Ve evet, örneği xml'de gösterdim, ama aslında bir JSON yanıtı alıyorum. – Idan

+0

no, değil, ama bunun için bir başlatıcı var: - (id) initWithResourcePath: (NSString *) resourcePath params: (NSDictionary *) params objectClass: (Sınıf) klass keyPath: (NSString *) keyPath; – Jerceratops

+0

Veya, erişimciyi ekleyebilir, yalnızca modeli görünüm denetleyicileri modeli olarak ayarlamadan önce ayarladığınızdan emin olun. – Jerceratops

0

XML sorgusu RestKit 0.20 ile çalışmak için bu soruyu buldum. üstündeki cevabın zamanda

mümkün değildi - bu artık ek bir modül aracılığıyla geçerli:

pod 'RKXMLReaderSerialization', :git => 'https://github.com/RestKit/RKXMLReaderSerialization.git', :branch => 'master' 
: https://github.com/RestKit/RKXMLReaderSerialization

Sen Podfile Bu ekleyerek bunu yararlanabilir

Ve böylece kullanmak üzere kayıt: en azından benim kaynağında

[RKMIMETypeSerialization registerClass:[RKXMLReaderSerialization class] forMIMEType:@"application/xml"];