Клиент не может получить данные изображения от gcdwebserver

Я пытаюсь создать веб-сервер на iPhone, чтобы предоставить URL изображений в ablum. Перед отправкой ответа клиенту, мне нужно сделать некоторые настройки изображений (что-то вроде изменения размера). Эти действия занимают до 1 или 1,5 секунды на изображение перед ответом клиенту. (особенно на iPhone 4) Клиентская сторона не может получать данные, даже несмотря на то, что сообщения на консоли xcode уже показывают, сколько байтов было получено на некоторых сокетах. Какие варианты я могу использовать, чтобы решить эту проблему?

Другой вопрос: что произойдет, если я увеличу значение ConnectedStateCoalescingInterval до 2,0 или 3,0 секунды?

Благодарю.

========= 2015/08/24 13:05 Обновлено

Вот мой addHandlerForMethod: путь:requestClass:asyncProcessBlock:

    [_webServer addHandlerForMethod:@"GET" path:[NSString stringWithFormat:@"/image/%@",assetId] requestClass:[GCDWebServerRequest class] asyncProcessBlock:^(GCDWebServerRequest *request, GCDWebServerCompletionBlock completionBlock)
    {
        __strong typeof(weakself) strongself = weakself;
        [strongself requestImageDataByAssetURL:assetURL completionCb:^(NSData *photoData) {
            GCDWebServerDataResponse* response = [GCDWebServerDataResponse responseWithData:photoData contentType:@"image/png"];
            completionBlock(response);
        }];
    }];

Вот requestImageDataByAssetURL: завершении Cb:

- (void)requestImageDataByAssetURL:(NSURL *)assetURL completionCb:(void(^)(NSData *photoData))cbfunc {
    __block NSData *photoData;
    ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init];
    [library assetForURL:assetURL resultBlock:^(ALAsset *asset) {
        @autoreleasepool {
            uint64_t begin = mach_absolute_time();
            // <do some image processing here>
            uint64_t end = mach_absolute_time();
            NSLog(@"Time taken to imageResize %g s", MachTimeToSecs(end - begin));
            cbfunc(photoData);
        }
    } failureBlock:^(NSError *error) {
        NSLog(@"[%@] fail. Error=%@", NSStringFromSelector(_cmd), error.localizedDescription);
        cbfunc(nil);
    }];
}

Вот журнал:

[DEBUG] [2015-08-24 04:48:09 +0000] Did open connection on socket 32
[DEBUG] Connection received 221 bytes on socket 32
[DEBUG] Connection on socket 32 preflighting request "GET /image/9D959040-9FA8-4197-8150-8DC72339955D" with 221 bytes body
[DEBUG] Connection on socket 32 processing request "GET /image/9D959040-9FA8-4197-8150-8DC72339955D" with 221 bytes body
[DEBUG] [2015-08-24 04:48:10 +0000] Did open connection on socket 34
2015-08-24 12:48:10.799 xBoard[2981:3707] Time taken to imageResize 1.52039 s
[DEBUG] Connection received 221 bytes on socket 34
[DEBUG] Connection on socket 34 preflighting request "GET /image/9D959040-9FA8-4197-8150-8DC72339955D" with 221 bytes body
[DEBUG] Connection on socket 34 processing request "GET /image/9D959040-9FA8-4197-8150-8DC72339955D" with 221 bytes body
[DEBUG] Connection sent 171 bytes on socket 32
[DEBUG] Connection sent 123575 bytes on socket 32
[DEBUG] Did close connection on socket 32
[VERBOSE] [172.16.20.174:8080] 172.16.21.97:34450 200 "GET /image/9D959040-9FA8-4197-8150-8DC72339955D" (221 | 123746)
2015-08-24 12:48:12.028 xBoard[2981:4f0b] Time taken to imageResize 1.06382 s
[DEBUG] Connection sent 171 bytes on socket 34
[DEBUG] Connection sent 123575 bytes on socket 34
[DEBUG] Did close connection on socket 34
[VERBOSE] [172.16.20.174:8080] 172.16.21.97:50852 200 "GET /image/9D959040-9FA8-4197-8150-8DC72339955D" (221 | 123746)

Мы видим, что он создает первый сокет (32).
Затем немедленно создает второй сокет (34) для того же запроса изображения.
Похоже, что GCDWebServer немедленно закрывает первый сокет. Но почему?

PS Кстати, на стороне клиента для загрузки изображений используется библиотека Android Volley, а не веб-браузеры.

1 ответ

Решение

Похоже, в журнале нет ничего плохого: 2 GET запросы на путь /image/9D959040-9FA8-4197-8150-8DC72339955D обрабатываются на сокетах 32 и 34, и каждый возвращает 123 575 байтов.

Попробуйте использовать настольный веб-браузер, такой как Chrome и его веб-инспектор. Если все работает правильно, значит, проблема в вашем приложении для Android.

Другие вопросы по тегам