Я вижу проблему, в которой CFReadStreamRead
, как часть потоковой загрузки файлов, никогда не возвращается.
Это, похоже, происходит только на iOS7 - и гораздо чаще при отладке от физического устройства, чем в симуляторе, - или, по крайней мере, это гораздо более очевидно.
У нас есть HTTP (или HTTPS, проблема возникает в любом случае, с локально размещенным или удаленным сервером) POST
файла, с помощью прямого вызова с блокировкой (без события) CFNetwork. Это необходимость кода C, вызывающего этот обработчик; нет никаких условий для обратных вызовов.
Хорошо и хорошо, сетевые вызовы происходят в фоновых потоках и/или через асинхронную отправку.
Сетевой код, о котором идет речь, сводится к (устранению ошибок для краткости):
CFReadStreamRef upload = CFReadStreamCreateWithFile(
kCFAllocatorDefault, upload_file_url);
CFRelease(upload_file_url);
CFReadStreamOpen(upload);
CFReadStreamRef myReadStream = CFReadStreamCreateForStreamedHTTPRequest(
kCFAllocatorDefault, myRequest, upload);
CFReadStreamOpen(myReadStream);
CFIndex numBytesRead = CFReadStreamRead(myReadStream, buf, sizeof(buf));
// etc.
Сам по себе этот код хочет висеть сразу под iOS7. Если я добавлю цикл с некоторыми вызовами на usleep
до него (проверка CFReadStreamHasBytesAvailable
по пути), это почти всегда будет успешным. Каждые несколько сотен попыток, он все равно потерпит неудачу, никогда не вернется. Опять же, основной поток не изменяется.
Я надеялся, что GM прояснит это поведение, но оно все еще присутствует.
Добавление метода runloop/callback для наблюдения за доступными байтами событиями не влияет - когда вызов зависает, события не видны.
Любые предложения относительно того, почему это происходит, или как это можно предотвратить? Кто-нибудь еще видит поведение CFReadStream
в iOS 7?