2010-02-22 4 views
1

Je tente de télécharger une URL à l'aide de NSURLDownload, mais le téléchargement ne commence pas. Avant de continuer il faut dire que j'utilise GNUStep pour ça.NSURTélécharger ne pas démarrer

Les grandes lignes de mon projet est la suivante:

MyClass.h:

@interface MyClass : Object { 

} 

-(void)downloadDidBegin:(NSURLDownload*)download; 
-(void)downloadDidFinish:(NSURLDownload*)download; 

@end 

main.m

int main() 
{ 
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 

    NSLog(@"creating url"); 
    NSURL* url = [[[NSURL alloc] initWithString:@"http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSURLRequest_Class/NSURLRequest_Class.pdf"] autorelease]; 

    NSLog(@"creating url request"); 
    NSURLRequest* url_request = [[[NSURLRequest alloc] initWithURL:url] autorelease]; 

    NSLog(@"creating MyClass instance"); 
    MyClass* my_class = [[MyClass alloc] init]; 

    NSLog(@"creating url download"); 
    NSURLDownload* url_download = [[[NSURLDownload alloc] initWithRequest:url_request 
                   delegate:my_class] autorelease]; 

    [pool drain]; 
} 

Je NSLog est sur les deux fonctions dans MyClass et aucun d'eux est frappé. Que dois-je faire pour lancer le téléchargement? Ou est-ce un problème avec GNUStep?

+0

Êtes-vous sûr de vouloir sous-classer Object et non NSObject? Vous devriez probablement utiliser NSObject, juste au cas où quelque chose met votre délégué dans une collection ou quelque chose. (En outre, vous devriez vraiment penser à un meilleur nom que "MyClass", et gérer la vie de l'objet de manière appropriée en suivant les règles de gestion de la mémoire: http://developer.apple.com/mac/library/documentation/General/Conceptual/DevPedia -CocoaCore/MemoryManagement.html) –

Répondre

2

NSURTéléchargez les téléchargements en arrière-plan, de sorte que l'appel au initWithRequest:delegate: retourne immédiatement. À moins que votre programme passe le contrôle à la boucle d'exécution (il est géré automatiquement pour les applications, mais doit être fait manuellement pour les outils), il exécutera simplement le reste de la fonction main() et se terminera.

En outre, les messages à votre délégué sont envoyés à partir de la boucle d'exécution, même si principale() n'a pas quitté immédiatement, votre délégué encore ne recevraient pas downloadDidBegin: ou downloadDidFinish: à moins que votre premier code appelé l'un des NSRunLoop ' s exécuter des méthodes.

Ajoutez la ligne suivante à votre code, immédiatement avant [pool drain];:

[[NSRunLoop currentRunLoop] run];

Pour plus d'informations sur les boucles d'exécution, consultez le Thread Programming Guide.