2010-11-30 30 views
0

sur MacOSX, avec Core Foundation, je veux télécharger un fichier volumineux (plusieurs centaines de mégaoctets) vers un serveur distant via une API REST. Étant donné que le fichier est volumineux et que j'ai également besoin de donner quelques commentaires à l'utilisateur, je souhaite implémenter une fonctionnalité de téléchargement de CV et donner à l'utilisateur des informations sur le nombre d'octets écrits.[OSX Core Foundation] Comment puis-je télécharger un fichier de manière asynchrone via HTTP et recevoir un rappel lors de l'envoi d'octets du flux?

J'ai d'abord suivi le guide Apple pour la programmation CFNetwork: http://developer.apple.com/library/ios/#documentation/Networking/Conceptual/CFNetwork/CFFTPTasks/CFFTPTasks.html#//apple_ref/doc/uid/TP30001132-CH9-SW1 Mais le téléchargement asynchrone de fichier est uniquement pour FTP.

J'ai essayé d'utiliser CFReadStreamCreateForHTTPRequest mais je n'ai reçu que des rappels en réponse. J'ai essayé avec CFReadStreamCreateForHTTPStreamedRequest et j'ai défini un délégué sur le paramètre de corps ReadStreamRef, mais il n'est jamais appelé même si j'ouvre le flux avant de le planifier sur la boucle de lancement.

Si quelqu'un a quelques conseils sur la façon de le faire, ce serait génial. Merci beaucoup!

- Rémy

Répondre

0

J'obtenu une réponse ici: http://lists.apple.com/archives/macnetworkprog/2010/Dec/msg00000.html.

 
CFReadStreamCreateForHTTPStreamedRequest is the good function to use. 

Pour télécharger des commentaires, utiliser un minuteur programmé sur le runloop lors de la création de la demande:

 
CFRunLoopTimerCreate(kCFAllocatorDefault, 0, 10.0, 0, 0, ...); 

Pour résumer, il y a deux étapes.

Cherchez le flux de contenu local au bon décalage

Une fois que le flux de contenu local créé (mais pas encore ouvert), je peux chercher dans l'aide

 
CFReadStreamSetProperty(content_stream, kCFStreamPropertyFileCurrentOffset, uploaded_length); 

Configurer http têtes

Je n'ai pas de serveur distant style webdav, donc j'utilise les en-têtes de plage HTTP pour informer le serveur de la partie du fichier que je veux télécharger. Cette étape dépend de ce que le serveur distant attend.

 
CFHTTPMessageSetHeaderFieldValue(request_headers, CFSTR("Range"), content_range_value); 

Espérons que cela aidera.