2012-02-27 4 views
0

Вам нужна ваша помощь.Многопоточность в ios

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

И мой основной поток должен продолжать проверять папку документа и отображать обновленные данные в режиме просмотра.

Детская нить должна заканчиваться, как только вид исчезает. и начните снова, как только появится представление.

Каков наилучший способ сделать это? NSThread или NSOperationQueue? Какие меры предосторожности необходимы? Мне также нужно получить доступ к нескольким переменным класса. Так что это должно быть потокобезопасным.

Заранее спасибо.

С уважением

+0

Пробовал много вещей. но не смог достичь моей цели. Кто-нибудь может предложить мне что-то. Я хочу создать один поток, который будет работать непрерывно в фоновом режиме. У него будет некоторое время (1) цикл, в котором я буду загружать 10-20 изображений повторно. Загрузка будет выполняться синхронно/асинхронно в потоке. В асинхронных вызовах проблема, с которой я сталкиваюсь, заключается в том, что функция callback success/fail не вызывается. В вызовах синхронизации проблема, с которой я сталкиваюсь, заключается в том, что я не могу отправить имя пользователя и пароль в запросе url. – Nir

ответ

2


Если вам не нужно обновлять прогресс бар или что-то в iOS5 есть один большой метод + sendAsynchronousRequest:queue:completionHandler: API, который позволяет запускать асинхронной загрузки в блок внутри NSOperationQueue. Если нет, вы должны изучить сторонние библиотеки, такие как запрос ASIHTTP или https://github.com/AFNetworking/AFNetworking (возможно, лучше, последний), или вам нужно создать собственный менеджер загрузок, а не простое задание

+0

Спасибо за ваше предложение. Я не просто хочу загружать данные. Но также нужно выполнять другую задачу в потоке. Во-вторых, он должен продолжать работать в фоновом режиме. Как вы думаете, sendAsynchronousRequest: queue: completeHandler: это лучший способ сделать это? – Nir

+0

Ну, зависит, если вам нужно что-то сделать с данными, которые поступают во время загрузки .. это не так, потому что это просто дает вам возможность сделать что-то в обработчике соревнований. Позвольте мне сделать пример, этот файл, который вам нужно скачать, действительно большой. В этом случае вы бы выбрали поток или обработчик файлов, который добавляет данные по мере их поступления не только в конце.Я предполагаю, что вам следует взглянуть на AFNetoworking, это просто «простая» оболочка вокруг метода NSURLconnection. – Andrea

+0

Хорошо спасибо. Пройдёт через AFNetoworking. – Nir

0

есть два способа сделать это.

Во-первых: вы используете NSOperationQueue, который немного более объемный, поскольку он построен на GCD, но имеет некоторые дополнительные функции.

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

+0

Будет ли это работать для асинхронных вызовов? – Nir

+0

Идея async заключается в том, чтобы что-то делать в фоновом потоке, чтобы она не влияла на вашу основную очередь, которая обычно используется для пользовательского интерфейса. Так вот в чем их цель, чтобы обеспечить вам асинхронное поведение. –

+0

Не совсем, это недоразумение, что все обратные вызовы NSURLConnection работают над основным потоком, вы можете просто поставить журнал, запрашивающий текущий поток. Если не создать цикл запуска во вторичном потоке, этот поток никогда не получит методы делегата. Асинхронное соединение не блокирует основное, просто так, потому что оно асинхронно, поэтому он прикрепляет данные в куске для каждого цикла цикла цикла. Более того, как вы можете видеть из обратного вызова делегации, им не нужно столько времени, чтобы закончить. NSOperationQueue, так как ioS4 запускает все операции над новым потоком, что означает, что если вы не создаете цикл, все не хватает – Andrea

0

Вы можете взглянуть на - (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg Этот метод создает новый поток в вашем приложении, помещая ваше приложение в многопоточный режим, если он еще не был. В вашем представленииDidDisappear вы можете остановить задачу, когда ваше представление исчезнет

Из документов Apple. Apple рекомендует исследовать альтернативные технологии Mac OS X для реализации параллелизма. Это особенно верно, если вы еще не знакомы с методами проектирования, необходимыми для реализации многопоточного приложения. Эти альтернативные технологии упрощают работу, которую вы должны выполнить, для реализации параллельных путей исполнения и обеспечения гораздо большей производительности, чем традиционные потоки. https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/AboutThreads/AboutThreads.html#//apple_ref/doc/uid/10000057i-CH6-SW2

+0

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

+0

@ Андреа Я столкнулся с этой проблемой. Я использую async-вызов в своем потоке. и это создает проблему. Итак, каков наилучший способ использования асинхронного вызова в потоке? Я пробовал использовать NSThread и GCD. В обоих случаях я столкнулся с одной проблемой – Nir

+0

@Andrea Теперь я буду пытаться NSOperation. – Nir

Смежные вопросы