Отправка больших объемов данных с nsfilehandle
-
01-10-2019 - |
Вопрос
Поэтому я использую образцы Apple Picturaling / PictionsharingBrowser для отправки и получения данных. Это использует NSFileHandle на стороне сервера, чтобы отправить изображение с использованием метода NSFilehandle Wantedata.
NSFileHandle * incomingConnection = [[aNotification userInfo] objectForKey:NSFileHandleNotificationFileHandleItem];
[[aNotification object] acceptConnectionInBackgroundAndNotify];
[incomingConnection writeData:dataToWrite];
[incomingConnection closeFile];
Это, кажется, работает нормально, пока не захочу прислать большие объемы данных (в этом случае 1 МБ данных стоимостью). Когда я пытаюсь этому, приложение зависает при выполнении метода писателей. Клиент даже не начинает читать данные, он просто открывает соединение, но ничего не происходит. (Предполагается, что он читает кусок данных с помощью куска, а сервер отправляет все данные TEH одновременно).
Я предполагаю, что некоторые тупики происходят где-то, но я не уверен, где. Я пытался искать async. Способ написания данных Чака Chuck с nsfilehandle, но я не мог найти такой путь.
Любое руководство поможет!
Решение
Я пропустил один шаг в основном ... в NsnetserviceBoSwer's NetserviceBrowser: Didfindservice :( Morecoming: Способ делегата, а не мне просто пытаться подключиться к каждому входящему сервису, я вместо этого (как говорит Док :)) Сохранить сервис, установите делегат для этого нашли службу и попытаться разрешить услугу.
Я тогда могу открыть поток в разрешенную службу в * - (void) netservicedidresolleddress: (Nsnetservice ) отправитель который представляет собой делегат 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.