Метод делегата AsyncSocket вызван неправильно? - PullRequest
0 голосов
/ 22 апреля 2011

Я передаю достаточно большое изображение по локальной сети с iPhone на Mac с помощью класса AsyncSocket. В заголовке метод делегата didReadData объявлен как показано ниже:

/**
 * Called when a socket has completed reading the requested data into memory.
 * Not called if there is an error.
**/
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;

В нем говорится, что этот метод будет вызван, когда сокет завершит чтения данных. Однако этот метод вызывается много раз, каждый раз, когда длина данных увеличивается. Как я должен знать, когда загрузка закончится? Должен ли я отправлять длину данных в первых нескольких байтах?

1 Ответ

3 голосов
/ 22 апреля 2011

Этот метод делегата действительно будет вызван, когда сокет завершит чтение данных.Недостающая часть уравнения сообщает AsyncSocket , когда полученные данные завершены.У него нет понимания данных, которые вы пытаетесь получить, вы должны сказать об этом - как вы уже упоминали в своем последнем вопросе.

Вот где действительно сияет AsyncSocket.Вы действительно можете отправить изображение с префиксом его длины и позволить классу творить чудеса.Ваш код будет выглядеть примерно так:

[sock readDataToData:[AsyncSocket CRLFData] withTimeout:0 tag:kLengthTag];

В вашем методе делегата:

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
    if (tag == kLengthTag) {
        NSUInteger length = /* read length out of nsdata */;
        [sock readDataToLength:length withTimeout:0 tag:kImageTag];
    } else if (tag == kImageTag) {
        /* hurray, you have your image! */
    }
}

Конечно, если вы передаете достаточно большие изображения, вы можете отслеживатьваш прогресс.Для этого есть метод экземпляра -[AsyncSocket progressOfReadReturningTag:bytesDone:total:].Также есть метод делегата -[id<AsyncSocketDelegate> onSocket:didReadPartialDataOfLength:tag:].

...