2012-07-03 14 views
5

Bir rss feed'ini ayrıştırmak için NSXmlParser kullanıyorum. Her şey yolunda çalışıyor.Yalnızca ilk on iletiyi ayrıştırmak için NSXMLParser'ı kullanın ve ardından sonraki lotu ayrı ayrı ayrıştırın

I will sonunda mesajların onlarca/yüzlerce içeren rss feed tahmin ediyorum. Şu anki çözümüm, rss feed'ini okuyor ve sonuçları gösteriyor. Ancak sadece ilk on mesajı okumak istiyorum (potansiyel olarak yüzlerce öğeyi ayrıştırmak için). Daha sonra (ondan sonra kullanıcı tablonun sonuna ulaştığında) sonraki on mesajı ayrıştırmak için.

Benim soru ben ilk on mesajları ayrıştırmak nasıl, daha sonra önümüzdeki on mesajları, vb sonra önümüzdeki on mesajları ve ... İşte

Ben TÜM mesajları almak için kullanıyorum budur ayrıştırmak:

- (void)parseXMLFileAtURL:(NSString *)URL 
{ 
    myArray = [[NSMutableArray alloc] init]; 

    //convert the path to a proper NSURL or it won't work 
    NSURL *xmlURL = [NSURL URLWithString:URL]; 

    rssParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL]; 
    [rssParser setDelegate:self]; 
    [rssParser parse]; 

} 

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { 
    //error 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{    

    currentElement = [elementName copy]; 

    if ([elementName isEqualToString:@"item"]) { 
     //clear out our story item caches... 
     item = [[NSMutableDictionary alloc] init]; 

    } 

} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{  

    if ([elementName isEqualToString:@"item"]) { 
     // save values to an item, then store that item into the array... 
    } 

} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 

    // save the characters for the current item... 

} 

- (void)parserDidEndDocument:(NSXMLParser *)parser { 

    [myTable reloadData]; 

} 

cevap

0

Sen ayrıştırmayı durdurmak için [rssParser abortParsing] çağırabilir. Durdurduktan sonra, xml'nin ilk bölümünü elle kesmeniz gerekir. Ya da web servisine bir şekilde söyleyin. NSXMLParser, oraya atlamak için bir erişim vermez.

0

Kesinlikle sınıf başlığında bir sayma Var olun: sizin delege olarak

... 
@private 
    NSUInteger rssCounter; 
... 
@property (nonatomic, assign) NSUInteger rssCounter; 
... 

init yöntemi:

rssCounter = 0; 

sonra gibi bir elementin bitişini vurduğuz Sonra sadece bu şekilde arttıracaktır @Metalmi tarafından belirtildiği gibi, bir öğe başlatılırken başka bir blokta ayrıştırmayı iptal etmeyi kullanın.

Bundan sonra, tekrar tüm süreci tetiklemek gerektiğinde Arayabileceğin hangi 10 daha yüklemek gerektiğinde 0'a değişkeni sıfırlar bir yöntem oluşturun. gibi

şey: Bu yardımcı olur

- (void)restartParsing:(NSString *)url 
{ 
    rssCounter = 0 
    [self parseXMLFileAtURL:url]; 
} 

Umut.

+0

Bu, xml'in ikinci yarısını ayrıştırırken performans sorunlarına neden olacaktır, aksi halde tek bir adımda hepsini ayrıştırmak iyi olacaktır –

+0

@MarkPervovskiy Neden bunun performans sorunlarına neden olacağını bilmiyorum: açıklığa kavuşabilir misiniz? – Ben

+0

Ayrıştırma XML yavaş bir işlemdir ve özellikle xml "yüzlerce gönderi" içerdiğinde herhangi bir zaman alabilir. Böylece, çözümünüz ilk 10 yazıyı, ardından ilk 20 yayını, ardından ilk 30 gönderiyi vb. Bir dakika kullanıcı, saniyelerinin yarısı nasıl geçtiğini görecek. –

7

Diğerlerinden farklı bir tarzda, ayrıştırıcınız 10 ve 100 arasındaki farkın önemli bir insan ölçülebilir miktarı olduğu ayrıştırmak için uzun sürüyorsa, yanlış bir şey yapıyorsunuz demektir. Muhtemelen en iyi şudur:

  1. bir arka plan iş parçacığı
  2. Sadece gösterilecek ilk 10 (a daha fazla ölçülebilir bir XML kitaplık veya bulmak)
  3. Ayrıştırma tüm sürü yavaşlama bulmak için ayrıştırma kodu Profil user,
  4. Geri kalanını, bellekte oldukları gibi görüntüleyin.

bunu tek seferde daha basit kod ve daha az hata yapar ve "yükleme" Bir seferde bir rss "sayfa" bir (gösteriliyor) yıldırım hızlı olacak ve kullanıcıların seveceğim ayrıştırma çünkü çifte kazançtır Eğer ben @coneybeare katılıyorum

+0

Kesinlikle bu. İyi arkadaşımız dispatch_async'i kullanmak istiyorsun. GCD'ye aşina değilseniz, konuyla ilgili WWDC videolarını izlemenizi ve aklınızı uçurmaya hazırlanmanızı öneririm. –

0

(taklit hızına örnekler için Instagram bakın), arka plan iş parçacığı xml ayrıştırma ve bellekte sonucunu saklamak için doğru yol olarak görünmektedir.Hala "sayfa sayfa" xml ayrıştırmak istiyorsanız

Yine de, (örneğin XMLPerformance sample bakınız) libxml dan xmlParseChunk kullanarak bunu yapabilirsiniz. Öğeleri manuel olarak hesaplamanız ve fazlalığı bir yerde depolamanız gerekecek, ancak sanırım kutudan çıkartabileceğiniz en yakın işlevsellik.

Başka bir yol, Objective-C free açık kaynak xml ayrıştırıcısını kullanmaktır (örneğin DOM-ayrıştırıcısı, örneğin TBXML olabilir) ve kendi ayrıştırma döngüsünü size uygun şekilde ayırmaktır.

İlgili konular