Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 具有核心数据和大量业务逻辑的Cocoa应用程序布局_Iphone_Arrays_Cocoa Touch_Model View Controller_Core Data - Fatal编程技术网

Iphone 具有核心数据和大量业务逻辑的Cocoa应用程序布局

Iphone 具有核心数据和大量业务逻辑的Cocoa应用程序布局,iphone,arrays,cocoa-touch,model-view-controller,core-data,Iphone,Arrays,Cocoa Touch,Model View Controller,Core Data,对于那些看到我的其他问题的人:我正在取得进展,但我还没有意识到这一点。我已经对stackoverflow的答案和像Cocoa With Love这样的网站倾诉了很多,但我还没有找到一个适合的应用程序布局(为什么缺少科学或商业应用程序的例子?食谱和书籍的例子太简单了) 我有一个数据分析应用程序,其布局如下: 通信管理器(单例,管理硬件) DataController(告诉Comm.mgr要做什么,并检查它接收到的原始数据) 模型(从datacontroller接收数据、清理、分析和存储数据) M

对于那些看到我的其他问题的人:我正在取得进展,但我还没有意识到这一点。我已经对stackoverflow的答案和像Cocoa With Love这样的网站倾诉了很多,但我还没有找到一个适合的应用程序布局(为什么缺少科学或商业应用程序的例子?食谱和书籍的例子太简单了)

我有一个数据分析应用程序,其布局如下:

通信管理器(单例,管理硬件)
DataController(告诉Comm.mgr要做什么,并检查它接收到的原始数据)
模型(从datacontroller接收数据、清理、分析和存储数据)
MainViewController(现在是skeleton,侦听comm.mgr以显示视图和警报)

现在,我的数据永远不会直接显示在视图上(比如一个简单的实体和属性表),我可能会使用core plot来绘制分析结果(一旦我弄明白了)。保存的原始数据将是巨大的(10000的点),而我使用的是一个C++包,它被包裹在Objc++类中。vector类还具有encodeWithCoder和initWithCoder函数,它们使用NSData作为向量的传输。我试图遵循正确的设计实践,但我不知道如何将持久性存储引入我的应用程序(存储和查看旧数据集需要持久性存储)

我读过一些资料,说“业务逻辑”应该进入模型类。这就是我现在拥有它的方式,我向它发送原始数据,它解析、清理和分析结果,然后将这些结果保存到ivar数组(vector类的)中。然而,我还没有看到一个核心数据示例有一个托管对象,它不是一个非常基本属性(字符串、日期)的简单存储,它们从来没有任何业务逻辑。所以我想知道,我怎样才能融合这两个方面?我的所有分析都应该进入数据控制器并让它管理对象上下文吗?如果是,我的模型在哪里?(如果我的数据存储在我的控制器中,似乎会破坏MVC体系结构-读取:由于这些是矢量阵列,我不能不断地将它们编码和解码为NSData流,它们需要一个存在的地方,然后我将它们与核心数据一起保存到磁盘,在我从存储器中检索并解码它们以供审查后,它们需要一个存在的地方)


任何建议都会有帮助(即使是在我已经开始的布局上)。我只是画了一些物体之间的交流,给你一个想法。此外,我还没有在模型和视图/视图控制器之间建立任何连接(目前使用NSLog)。

我认为您可能对核心数据的读取有点过多。我对它没有太多的经验,所以我以非专家的身份说,但基本上有两类数据存储系统

首先是基本数据库,如SQLite、PostgreSQL或任何数量的解决方案。这是为了存储和检索数据;没有逻辑,所以你必须弄清楚如何管理这些表,等等。有时这有点棘手,但它们非常有效。他们最擅长以原始形式管理大量数据;如果您希望对象包含这些数据,您必须自己创建和管理它们

然后您就有了一些类似于核心数据的东西,它不应该被视为一个数据库,而应该被视为一个“对象持久性”框架。使用核心数据,您可以创建对象、存储它们,然后将它们作为对象检索。对于应用程序来说,它非常适合于拥有大量对象,每个对象都包含多个数据片段和与其他对象的关系

根据我对您情况的有限了解,我大胆猜测,一个真正的数据库可能更适合您的需要,但您必须在那里做出决定(如我所说,我对您的情况了解不多)

至于MVC,我的观点是视图应该只包含显示代码,模型应该只包含管理数据本身及其存储的代码,控制器应该包含处理数据的逻辑。在您的情况下,听起来像是在收集原始数据并在存储之前对其进行处理,在这种情况下,您希望在将数据存储到模型中之前使用另一个对象来处理数据,然后使用单独的控制器在视图接收数据之前对数据进行排序、管理和其他准备。再说一次,这可能不是最好的解释(或者对你的情况来说是最好的方法),所以对此持保留态度

编辑:另外,如果你想更多地了解核心数据,我喜欢。它比我更好地解释了整个对象持久性与数据库概念。

虽然vector非常适合处理您正在采样的数据(因为它支持动态调整底层存储的大小),但您可能会发现,对于已经存储的数据,直C数组就足够了(甚至更好)。这确实增加了一定程度的复杂性,但它避免了为已经具有已知静态大小的数据阵列创建副本

NSData的-字节返回指向NSData对象内原始数据的指针。核心数据支持NSData作为其属性类型之一。如果您知道数据中每个项目的大小,那么可以使用-length来计算元素的数量,等等

在采样方面,我建议在收集数据时使用vector,并间歇性地将数据复制到NSData属性并保存。注意:我在使用这种方法()时遇到了一点问题,即当NSMutableData对象支持NSData属性并且该可变对象的数据发生更改时,我无法识别对该属性所做的更改

至于MVC问题。我建议按模型管理数据(模型)。视图和控制器可以要求模型提供数据(或数据子集),以便显示。但数据的所有权取决于模型。在我的例子中,可能与您的情况类似,有时模型返回简化的数据集(使用道格拉斯·佩克算法)。视图和控制器并不比po更明智
// Exposed interface for adding data point to stored data
- (void) addDatum:(double_t)datum
    {
    [self addToCache:datum];
    }

- (void) addToCache:(double_t)datum
    {
    if (cache == nil)
        {
        //  This is temporary. Ideally, cache is separate from main store, but
        //  is appended to main store periodically - and then cleared for reuse. 
        cache = [NSMutableData dataWithData:[self dataSet]];
        [cache retain];
        }
    [cache appendBytes:&datum length:sizeof(double_t)];
    //  Periodic copying of cache to dataSet could happen here...
    }

// Called at end of sampling.
- (void) wrapup
    {
    [self setDataSet:[NSData dataWithData:cache]];  // force a copy to alert Core Data of change
    [cache release];
    cache = nil;
    }