[OSX Core Foundation] Как я могу асинхронно загрузить файл через HTTP и получить обратный вызов при отправке байтов потока? - PullRequest
0 голосов
/ 30 ноября 2010

в MacOSX, с Core Foundation, я хочу загрузить большой файл (несколько сотен мегабайт) на удаленный сервер через REST API.Поскольку файл большой, и мне также нужно дать пользователю некоторую обратную связь, я хочу реализовать функцию загрузки резюме и дать пользователю обратную связь о количестве записанных байтов.

Сначала я следовал Apple Guide for CFNetworkпрограммирование: http://developer.apple.com/library/ios/#documentation/Networking/Conceptual/CFNetwork/CFFTPTasks/CFFTPTasks.html#//apple_ref/doc/uid/TP30001132-CH9-SW1 Но асинхронная загрузка файла только для FTP.

Я пытался использовать CFReadStreamCreateForHTTPRequest, но я получал только обратные вызовы при ответе.Я попытался с CFReadStreamCreateForHTTPStreamedRequest, и я установил делегат для параметра тела ReadStreamRef, но он никогда не вызывается, даже если я открываю поток перед тем, как фактически планировать его в runloop.было бы здорово.Большое спасибо!

- Реми

1 Ответ

0 голосов
/ 10 декабря 2010

Я получил ответ здесь: http://lists.apple.com/archives/macnetworkprog/2010/Dec/msg00000.html.

CFReadStreamCreateForHTTPStreamedRequest is the good function to use.

Для отправки отзыва я использую таймер, запланированный в runloop при создании запроса:

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

Для резюме,Есть два шага.

Поиск локального потока контента с хорошим смещением

Как только локальный поток контента создан (но еще не открыт), я могу искать в немиспользование

CFReadStreamSetProperty(content_stream, kCFStreamPropertyFileCurrentOffset, uploaded_length);

Настройка заголовков http

У меня нет удаленного сервера в стиле webdav, поэтому я использую заголовки диапазона HTTP для информирования сервера о том, какая частьфайл, который я хочу загрузить.Этот шаг зависит от того, что ожидает удаленный сервер.

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

Надеюсь, это поможет.

...