gpt4 book ai didi

ios - 从 objective-c 中的两个不同进程写入资源的最佳实践

转载 作者:可可西里 更新时间:2023-11-01 05:30:29 25 4
gpt4 key购买 nike

我有一个关于我试图用我的应用程序解决的问题的一般性 Objective-C 模式/实践问题。我在这里找不到类似的以 Objective-C 为中心的问题/答案。

我的应用程序包含一个可变的对象数组,我称之为“记录”。该应用程序收集记录并通过以下两种方式之一将它们放入该数组中:

  1. 它从应用程序沙盒中本地可用的 SQLite 数据库中读取数据。读取通常非常快。
  2. 它从网络服务异步请求数据,等待它完成然后解析数据。读取速度可以很快,但通常不是。

有时,应用程序基本上同时从数据库 (1) 读取数据并从网络服务 (2) 请求数据。通常情况下 (1) 将在 (2) 完成之前完成,并且将 Records 添加到可变数组不会导致冲突。

我担心在某些时候我的 SQLite 读取过程会花费比预期更长的时间,并且它会尝试在异步请求完成并执行相同操作的同时将对象添加到可变数组;或相反亦然。这些边缘情况似乎难以测试,但肯定会使我的应用程序崩溃,或者至少会导致我的记录数组出现问题。

我还应该指出,记录将被合并到可变数组中。例如:如果 (1) 首先运行并返回 10 条记录,然后在 (2) 完成并返回 5 条记录后不久,我的可变数组将包含所有 15 条记录。我正在组合数据而不是覆盖它。

我想知道的是:

  • 当进程 (1) 或 (2) 完成时,将对象添加到同一个可变数组实例是否安全?
  • 在 objective-c 中是否有一个好的模式/实践来实现这种处理?
  • 这是否涉及锁定对可变数组的访问,因此当 (1) 向其添加对象时 (2) 在 (1) 完成之前不能添加任何对象?

感谢您分享任何信息。

[编辑#1]

为了后代,我发现这个 URL 对理解如何使用 NSOperations 和 NSOperationQueue 有很大帮助。它有点过时,但仍然有效:

http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues

此外,它没有具体谈论我要解决的问题,但它使用的示例很实用且易于理解。

[编辑#2]

我决定采用 danh 建议的方法,我将在本地读取并在本地读取完成后根据需要点击我的网络服务(无论如何应该很快)。 Taht 说,我将尝试完全避免同步问题。为什么?因为 Apple 是这么说的,所以在这里:

http://developer.apple.com/library/IOS/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW8

Avoid Synchronization Altogether

For any new projects you work on, and even for existing projects, designing your code and data structures to avoid the need for synchronization is the best possible solution. Although locks and other synchronization tools are useful, they do impact the performance of any application. And if the overall design causes high contention among specific resources, your threads could be waiting even longer.

The best way to implement concurrency is to reduce the interactions and inter-dependencies between your concurrent tasks. If each task operates on its own private data set, it does not need to protect that data using locks. Even in situations where two tasks do share a common data set, you can look at ways of partitioning that set or providing each task with its own copy. Of course, copying data sets has its costs too, so you have to weigh those costs against the costs of synchronization before making your decision.

最佳答案

Is it safe for me to add objects to the same mutable array instance when the processes, either (1) or (2) finish?

绝对不是。 NSArray,以及其余的集合类,are not synchronized .当您添加和删除对象时,您可以将它们与某种锁结合使用,但这肯定比只创建两个数组(每个操作一个)并在它们都完成时合并它们要慢得多。

Is there a good pattern/practice to implement for this sort of processing in objective-c?

不幸的是,没有。您最多可以想到的是触发一个 bool 值,或者在一个公共(public)回调中将一个整数递增到某个数字。为了明白我的意思,这里有一些伪代码:

- (void)someAsyncOpDidFinish:(NSSomeOperation*)op {
finshedOperations++;
if (finshedOperations == 2) {
finshedOperations = 0;
//Both are finished, process
}
}

Does this involve locking access to the mutable array so when (1) is adding objects to it (2) can't add any objects until (1) is done with it?

是的,见上文。

关于ios - 从 objective-c 中的两个不同进程写入资源的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15670889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com