Как запустить две задачи независимо

#objective-c #multithreading #cocoa #macos

#objective-c #многопоточность #cocoa #macos

Вопрос:

Я создаю одно приложение на Mac OS X (10.6). В этом приложении у меня есть один экран, на котором пользователь будет вводить данные, которые будут сохранены в виде списка в локальной папке. Этот файл plist необходимо перенаправить на сервер с помощью почтовой службы HTTP. Должна быть проверка подключения к серверу, и если соединения завершатся неудачно, файлы будут сохранены в локальной папке. По истечении определенного времени снова будет проверено соединение с сервером, и если оно найдено, то будут отправлены все файлы, хранящиеся в локальной папке, один за другим.

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

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

Спасибо, Барун

Комментарии:

1. Я использую COCOA / Objective C для сборки приложения.

Ответ №1:

В Objective-C существует несколько подходов к потоковой обработке! Самая простая стратегия — NSOperationQueue. Переопределите NSOperation для обработки вашего HTTP-запроса, необязательно установите блок завершения, если вам нужно получать уведомления о выполнении, добавьте его экземпляр в объект NSOperationQueue, и все готово. Настройте NSTimer, чтобы перенести загрузку, если она завершится неудачей с первого раза. Вы можете использовать NSURLConnection для обработки веб-материалов. Обратите внимание, что NSURLConnection может устанавливать соединения асинхронно или блокировать. Поскольку ваш подкласс NSOperation уже выполняется в отдельном потоке, вы, вероятно, захотите использовать метод блокировки (если вы этого не сделаете, вам придется создать параллельный подкласс NSOperation, что требует намного больше работы).

Вы также можете использовать API Grand Central Dispatch, привязать новый поток к указанным вами методам или использовать обычный старый c (я бы не рекомендовал последние две, но полезно упомянуть о них). В качестве бонуса, NSOperationQueue и Grand Central Dispatch оба знают, «что правильно», когда у вас выполняется несколько операций одновременно, и будут масштабировать количество потоков в соответствии с количеством ядер на компьютере пользователя для получения наилучшей производительности.

Проверьте документы на наличие NSOperationQueue, NSOperation и NSURLConnection. Руководства и примеры проектов будут содержать весь исходный код, который вам понадобится, чтобы начать работу в правильном направлении.

Комментарии:

1. Я нашел пост довольно интересным. Не могли бы вы, пожалуйста, привести несколько примеров кода данной проблемы.