Créer un gestionnaire de DLs

19:48 modifié dans API AppKit #1
Bonjour à  tous,
Voilà , j'aimerai construire un petit gestionnaire de téléchargement (comme celui de Safari).
Je n'ai pas vraiment de piste sur la façon de faire...
Mis à  part qu'il faut NSURLDownload, que j'utilise déjà  mais qui ne gère qu'un téléchargement à  la fois  ???
Donc pour l'instant je me questionne sur le "comment gérer plusieurs téléchargements"

Merci à  tous ;)

Réponses

  • 19:48 modifié #2
    Deux pistes:
    - tu fais du multithread et dans chacune des threads, tu fais un download. Le point compliqué est surtout pour tenir à  jour l'affichage dans le gestionnaire de téléchargement.
    - tu crées des NSTask dans lesquelles tu lances des outils en ligne de commande, comme curl (fourni d'office).
  • 19:48 modifié #3
    Salut,
    J'ai réussi .. sauf que j'arrive pas à  gérer la progression   :kicking:
    En fait, la progression devient la même pour tous les DLs.. j'en déduit que ça vient de mon NSURLResponse :
    - (void)download:(NSURLDownload *)download didReceiveDataOfLength:(unsigned)length<br />{<br />	NSLog(@&quot;response received&quot;);<br />	NSString *progressString;<br />	NSString *dataString;<br />	NSString *percentString;<br />    long long expectedLength=[downloadResponse expectedContentLength];<br />    bytesReceived=bytesReceived+length;<br />	float percentComplete=(bytesReceived/(float)expectedLength)*100.0;<br />	if((bytesReceived+length)&gt;1000000 &amp;&amp; ((float)expectedLength)&gt;1000000){<br />	dataString = [NSString stringWithFormat:@&quot;%0.1f%Mo / %0.1f%Mo&quot;, ((bytesReceived+length)/1000000), ((float)expectedLength/1000000)];<br />	}<br />	else<br />	if((float)expectedLength&gt;1000000 &amp;&amp; (bytesReceived+length)&lt;1000000){<br />   dataString = [NSString stringWithFormat:@&quot;%0.1f%Ko / %0.1f%Mo&quot;, ((bytesReceived+length)/1000), ((float)expectedLength/1000000)];<br />	}<br />	else<br />	if((float)expectedLength&lt;1000000 &amp;&amp; (bytesReceived+length)&lt;1000000){<br />	dataString = [NSString stringWithFormat:@&quot;%0.1f%Ko / %0.1f%Ko&quot;, ((bytesReceived+length)/1000), ((float)expectedLength/1000)];<br />	}<br />	percentString = [NSString stringWithFormat:@&quot;Achevé à  %0.1f%%&quot;, percentComplete];<br />	progressString = [NSString stringWithFormat:@&quot;%@ - %@&quot;, dataString, percentString];<br />	int i;<br />	i = 0;<br />	for (i=0; i &lt; [downloadsArray count]; i++){<br />		NSMutableDictionary *dico = [downloadsArray objectAtIndex:i];<br />		if([[dico objectForKey:@&quot;path&quot;] isEqualToString:[[[download request] URL] path]]){<br />			[dico setObject:progressString forKey:@&quot;progress&quot;];<br />		}<br />	}<br />	[downloadsTableView reloadData];<br />}
    


    J'ai pourtant fait comme ds la doc apple

    Edit : J'ai trouvé à  ma façon :p
  • 19:48 modifié #4
    Voili ce que ça donne :)
    ifreetedl2.png
    :)beta:
  • 19:48 modifié #5
    Et pourquoi tu ne soumets pas ton appli sur ce forum? Ne me dis pas qu'elle n'est pas fonctionnelle, je ne te croirai pas...
  • 19:48 modifié #6
    J'inclu pause, etc... et je poste la nouvelle à  Oxitan
    Cette gestionnaire sera inclu ds iFreete (voir la partie logiciels de OC)
    Le problème c'est que j'arrive pas encore à  créer une pause
    Pourtant je récupère le NSURLDownload du fichier sélectionné ds le tableau, je récupère le data grâce à  [monDownload resumeData]
    mais quand je veut ajouter ce data ds mon dico, il dit qu'il est nil.
    Pourtant si je fait
    <br />NSData *data;<br />data = [monDownload resumeData];<br />if(data!=nil){<br />NSLog(@&quot;test&quot;);<br />}<br />else{<br />[monDico setObject:data forKey:@&quot;DataKey&quot;];<br />}<br />il devrait dont m&#39;afficher &quot;test&quot; dans le log !? seulement voilà , cet idiot ne dit pas que data est nil et donc s&#39;occupe de la partie else{}<br />et quand on arrive à  mondico setObject:data ben il met dit ds le log &quot;je peux pas insèrer une valeur nil ds le dico&quot;
    
  • ChachaChacha Membre
    19:48 modifié #7
    dans 1118960019:

    <br />if(data!=nil)<br />
    


    Faudrait p'têt mettre ==, aussi, non ? ;D

    +
    Chacha
  • 19:48 modifié #8
    C'est du détail mais le "mieux" à  mon avis c'est :

    if(data)
    {
      [monDico setObject:data forKey:@DataKey];
    }
    else
    {
      NSLog(@data == nil);
    }
  • ChachaChacha Membre
    juin 2005 modifié #9
    Fais gaffe, je suis capable de troller là  dessus ! ;)
    Moi j'écrirais
    <br />if (!data)<br />  ...<br />else<br />  ...<br />
    


    Parce qu'à  la lecture du code, c'est plus facile à  lire (pour moi), dans le sens où je commence par me débarrasser du cas dégénéré en 1 ou 2 lignes, et qu'ensuite je peux me concentrer sur le code utile.
    En fait, ce que je n'aime pas, c'est quand on lit quelques lignes de code, qu'on tombe sur un "else", et qu'on ne sait même plus quel était le if.
    Bon, là , la question ne se pose pas trop, vu que les deux cas font une ligne chacun, mais c'est un principe.
    Voilà , c'était une remarque à  la chacha... Désolé !

    +
    Chacha
  • juin 2005 modifié #10
    Tant qu'à  rajouter mon grain, pour ce cas ci, le mieux c'est
    [monDico setValue:data forKey:@&quot;DataKey&quot;];
    


    Parce que contrairement à  [tt]setObject:forKey:[/tt], [tt]setValue:forKey:[/tt] permet d'avoir [tt]nil[/tt] comme premier argument, auquel cas il exécute [tt]removeObjectForKey:[/tt]

    Sinon Chacha, tu es sûr que ça va?

    Tu annonces une intention de troller, ce qui ne te ressemble déjà  pas. Mais ce qui dépasse le plus mon entendement est que tu as utilisé des smileys dans 2 posts le même jour.
  • ChachaChacha Membre
    19:48 modifié #11
    dans 1119022911:

    Sinon Chacha, tu es sûr que ça va?
    Tu annonces une intention de troller, ce qui ne te ressemble déjà  pas. Mais ce qui dépasse le plus mon entendement est que tu as utilisé des smileys dans 2 posts le même jour.

    Ouaip, t'as raison, mais je crois que j'avais un léger manque de sommeil qui traà®nait. Nan, en fait, le mieux, c'est de faire croire qu'on a usurpé mon identité. Mais que fait la police ?

    +
    Chacha
  • 19:48 modifié #12
    Ok sa marche Renaud merci
Connectez-vous ou Inscrivez-vous pour répondre.