2012-02-27 62 views
0

需要你的帮助。在多线程的ios

在我的应用程序中,我想实现一个后台进程,它可以持续运行并下载更新的数据并将其存储在文档文件夹中。

而我的主线程应该继续检查文档文件夹并在视图控件中显示更新的数据。一旦视图中消失

子线程应该结束。并在视图出现后重新开始。

这样做的最佳方法是什么? NSThread或NSOperationQueue?需要采取哪些预防措施? 我也必须访问该类的几个变量。所以应该是线程安全的。

在此先感谢。

问候

+0

试过很多东西。但无法实现我的目标。任何人都可以请给我一些建议。我想创建一个将在后台连续运行的线程。它会有一段时间(1)循环,我将重复下载10-20张图像。下载将在线程中同步/异步完成。在异步调用中,我面临的问题是,不调用成功/失败回调函数。在同步通话中,我面临的问题是,我无法在网址请求中发送用户名和密码。 – Nir 2012-03-03 10:01:54

回答

2


如果您不需要更新的iOS5进度条什么的有一个很大的API方法+ sendAsynchronousRequest:queue:completionHandler:,允许您运行的异步下载作为内部NSOperationQueue块。如果不是你应该看看第三方库,如ASIHTTP请求或https://github.com/AFNetworking/AFNetworking(可能会更好最后一个),或者你需要建立你自己的下载管理器,而不是一个简单的任务

+0

感谢您的建议。我不只是想下载数据。但也必须在线程中完成其他任务。其次,它应该保持在后台运行。你认为sendAsynchronousRequest:queue:completionHandler:是做这件事的最好方法吗? – Nir 2012-02-27 09:21:41

+0

好,取决于你需要做的事情与被下载时传入的数据..它不是,因为它只是给你机会做做在竞争中处理的东西。让我举个例子,你需要下载的文件真的很大。在这种情况下,你会选择一个流或一个文件处理程序来添加数据,不仅在最后。我想你应该看看AFNetoworking,只是NSURLconnection方法的一个“简单”包装。 – Andrea 2012-02-27 09:36:56

+0

好的谢谢。将通过AFNetoworking。 – Nir 2012-02-27 10:03:10

0

有两种方法可以做到这一点..

第一:你使用NSOperationQueue,它有点笨重,因为它是建立在GCD上的,但确实有一些额外的功能。

第二:您使用GCD(grand central dispatch)查看需求我会说GCD看起来很好,因为您可以轻松访问任何线程(主或背景),这会稍微快一点。

+0

这将用于异步调用吗? – Nir 2012-02-28 06:35:03

+0

异步背后的想法是在后台线程中执行某些操作,以便它不会影响通常用于UI的主队列。所以这就是这些的目的,为你提供异步行为。 – 2012-02-28 07:42:44

+0

不完全是,误解了主线程中的所有NSURLConnection回调工作,您可以只放一个日志询问当前线程。如果不在辅助线程上创建运行循环,则该线程将永远不会收到委托方法。异步连接不会阻塞主,因为是异步,所以它将数据以块的形式附加到运行循环的每个周期。此外,从代表团回拨中可以看出,他们不需要太多时间来完成。 NSOperationQueue自ioS4在新线程上运行所有操作,这意味着如果您不创建循环,则一切都会丢失 – Andrea 2012-02-28 08:14:37

0

你可以看看- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg这个方法在你的应用程序中创建一个新线程,如果你的应用程序还没有进入多线程模式。在您的viewDidDisappear中,您可以在视图消失时停止任务

从Apple Docs。 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 2012-02-27 14:26:36

+0

@Andrea我正面临着这个问题。我在我的线程中使用异步调用。这是创造问题。那么在线程中使用异步调用的最佳方式是什么?我尝试使用NSThread和GCD。在这两种情况下,我面临同样的问题 – Nir 2012-02-28 06:31:53

+0

@Andrea现在我将尝试NSOperation。 – Nir 2012-02-28 06:50:26