Отправка больших объемов данных с NSFileHandle - PullRequest
0 голосов
/ 28 июня 2010

Так что я использую образцы Apple PictureSharing / PictureSharingBrowser для отправки и получения данных. При этом NSFileHandle на стороне сервера используется для отправки изображения с использованием метода writeData NSFileHandle.

NSFileHandle * incomingConnection = [[aNotification userInfo] objectForKey:NSFileHandleNotificationFileHandleItem];

[[aNotification object] acceptConnectionInBackgroundAndNotify];
[incomingConnection writeData:dataToWrite];
[incomingConnection closeFile];

Кажется, это работает нормально, пока я не хочу отправлять большие объемы данных (в данном случае данные объемом 1 МБ). Когда я пытаюсь это сделать, приложение зависает при выполнении метода writeData. Клиент даже не начинает читать данные, он просто открывает соединение, но ничего не происходит. (он должен считывать порцию данных по порциям, в то время как сервер отправляет все данные одновременно).

Я предполагаю, что где-то происходит тупик, но я не уверен, где. Я пытался найти асинхронный. способ записи данных с помощью NSFileHandle, но я не смог найти такой способ.

Любое руководство поможет!

1 Ответ

0 голосов
/ 01 июля 2010

Я пропустил один шаг в принципе ... в NSNetServiceBrowser netServiceBrowser: didFindService :( moreComing: метод делегата, вместо того, чтобы просто пытаться подключиться к каждой входящей службе, я вместо этого (как говорит документ :) ) сохранить службу, установить делегата для этой найденной службы и попытаться разрешить службу.

Затем я могу открыть поток для разрешенной службы в * - (void) netServiceDidResolveAddress: (NSNetService ) sender , который является методом делегирования NSNetservice.

- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing {
    [aNetService retain];
    [aNetService setDelegate:self];
    [aNetService resolveWithTimeout:5.0];

}

- (void)netServiceDidResolveAddress:(NSNetService *)service{

    NSInputStream * istream;
    [sender getInputStream:&istream outputStream:nil];
    [istream retain];
    [istream setDelegate:self];
    [istream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [istream open];

    [service release];
}

//... NSStreamDelegate method to retrieve the data via the stream.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...