2013-03-27 3 views
1

Я создал программу, которая может отправить одно изображение с моего iPhone на Mac успешно. Проблема в том, что как только она закончит отправку, я хочу отправить некоторые другие данные (точно, что не имеет значения). Всякий раз, когда я пытаюсь отправить данные, я заблокирован в следующей строке:CFWriteStreamCanAcceptBytes Blocking

if (!CFWriteStreamCanAcceptBytes((CFWriteStreamRef)_outputStream)) { 
    NSLog(@"FAILED ErrorCode:2 saveAsWallpaper in server.m"); 
    return; 
} 

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

CFWriteStreamSetProperty(writeStream,kCFStreamPropertyShouldCloseNativeSocket, 
            kCFBooleanFalse); 

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

Любая помощь приветствуется, спасибо!

+0

Есть ли способ распечатать дополнительную информацию о том, почему я блокируюсь, например. NSError сортов? –

ответ

0

Так получилось, что отключение ARC каким-то образом помогло. Линии, как это не правильно работать с ним на (так как она требует ручного управления памятью от взглядов его):

if (kCFSocketSuccess != CFSocketSetAddress(_socket, (CFDataRef)CFBridgingRetain(address4))) { 

Обратите внимание на слово «Сохранить».

Не решение для всех, но отключение ARC, а затем управление утечками, я получил все, что отлично работает для моего проекта.

+0

привет, просто для уточнения, а затем CFWriteStreamCanAcceptBytes работал правильно?- Я оставил ARC и добавил проверку соединения в начале моего сообщения, пока во время общения я не проверю, что больше – user387184

+0

user387184, да. Должен был быть объект где-то, что требовалось, чтобы ARC отказывалась слишком рано. С тех пор мне удалось управлять собственной памятью, хотя мне теперь нужно научиться управлять памятью! –

+0

Я пробовал теперь без ARC, создав специальный класс связи, только делающий CFWriteStreamCanAcceptBytes, получивший пропуск writeStream - это тоже не работает, не знаю почему? – user387184

1

похоже на ошибку (или хотя бы несогласованность) с этим методом на новом iPhone5. Тот же самый CFWriteStreamCanAcceptBytes отлично работает на iPhone 3GS, но не на iPhone5.

Единственное решение, которое я нашел до сих пор, больше не использует CFWriteStreamCanAcceptBytes и просто пишет - это работает нормально.

Единственная проблема заключается в том, что таймаут занимает около 20-30 секунд после того, как соединение потеряно и вы все равно напишите.

Чтобы справиться с этим в первый раз, когда вы можете выполнить запись в другой задаче с помощью performSelectorInBackground и проверить, не потребовалось ли слишком много времени для возврата, вы можете быть уверены, что соединение потеряно, и установите свой собственный флаг, который можно использовать как хранитель ворот для последующих вызовов для записи.

Но в 99% случаев он работает нормально, так как соединение в порядке.

Я пробовал много альтернатив, но нет способа остановить выполнение write после его начала - так вот почему я использовал performSelectorInBackground.

Даже таймер, который должен выполняться через 5 секунд, должен ждать, так как запись без успеха занимает свое время и вообще не принимает никаких перерывов.

+0

А, я ценю ответ, и это то, о чем мне придется подумать позже, но я работаю над iPhone 4. Я не понимал, что разные модели будут затронуты, хотя это интересно. Точка за хороший ответ, хотя, любезно. –

+0

Кроме того, я попытался не использовать CFWriteStreamCanAcceptBytes, но вместо этого поток записи возвращает 0, что, по-видимому, означает «0, если поток был заполнен до объема (для потоков фиксированной длины)» в соответствии с документацией. –