标签: cocoa-design-patterns

使用Core Data访问远程数据的模式?

我正在尝试为使用外部数据源的iPhone编写Core Data应用程序.我并不是真的使用Core Data来保存我的对象,而是使用对象生命周期管理.我对如何将Core Data用于本地数据有一个很好的想法,但是遇到了一些远程数据问题.我将以Flickr的API为例.

首先,如果我需要说明最近的照片列表,我需要从外部数据源中获取它们.在我检索完列表之后,似乎我应该迭代并为每张照片创建托管对象.此时,我可以继续使用我的代码并使用标准的Core Data API来设置获取请求并检索有关狗的照片子集.

但是如果我想继续并检索用户照片列表怎么办?由于这两个数据集可能相交,我是否必须对现有数据执行获取请求,更新已存在的数据,然后插入新对象?

-

在较旧的模式中,我只是为每个数据集分别拥有单独的数据结构并适当地访问它们.最近的照片集和用户照片集.但由于核心数据的一般模式似乎是使用一个托管对象上下文,似乎(我可能是错的)我必须将我的数据与主数据池合并.但这似乎只是为了获取一系列照片而需要大量开销.我应该为不同的集创建单独的托管对象上下文吗?核心数据应该在这里使用吗?

我认为我对Core Data的吸引力在于之前(对于Web服务)我会请求某些数据并在请求中过滤它或者在代码中过滤它并生成我将使用的列表.使用Core Data,我可以获取对象列表,将它们添加到我的池中(根据需要更新旧对象),然后查询它.然而,我可以通过这种方法看到的一个问题是,如果对象被外部删除,我无法知道,因为我保留了我的旧数据.

我离开基地吗?人们在处理远程数据和核心数据时是否有任何模式?:)我发现有一些人说他们已经完成了它,并且它适用于他们,但很少有例子.谢谢.

iphone web-services core-data cocoa-design-patterns

8
推荐指数
1
解决办法
3143
查看次数

Core Data支持带索引的UITableView

我正在尝试实现支持索引的Core Data支持的UITableView(例如:出现在侧面的字符,以及与它们一起出现的节标题).在没有Core Data的情况下,我没有遇到任何问题:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;
Run Code Online (Sandbox Code Playgroud)

在没有使用索引的情况下实现由Core Data支持的UITableView也没有问题.

我想弄清楚的是如何优雅地将两者结合起来?显然,一旦索引和重新分区内容,就不能再使用标准的NSFetchedResultsController来检索给定索引路径的内容.所以我将索引字母存储在NSArray中,将我的索引内容存储在NSDictionary中.这一切都适用于显示,但在添加和删除行时我有一些真正的麻烦,特别是如何正确实现这些方法:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller;

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath;

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type;

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller;
Run Code Online (Sandbox Code Playgroud)

因为它返回的索引路径与核心数据中的索引路径没有相关性.当用户添加一行时,我通过简单地重建我的索引NSArray和NSDictionary来添加工作,但是当他们删除一个时,执行相同操作会导致整个应用程序崩溃.

是否有一个简单的模式/示例我在这里缺少使所有这些工作正常?

编辑:只是为了澄清我知道NSFetchedResultsController是开箱即用的,但我想要的是复制像Contacts应用程序这样的功能,其中索引是该人名的第一个字母.

iphone core-data uitableview nsfetchedresultscontroller cocoa-design-patterns

8
推荐指数
1
解决办法
1万
查看次数

目标C术语:网点和代表

我在理解iPhone如何处理事件的出口概念方面遇到了问题.救命!代表们也让我感到困惑.有人会关心解释吗?

iphone delegates objective-c cocoa-design-patterns outlet

8
推荐指数
2
解决办法
5306
查看次数

什么时候课程会有多个指定的初始化程序?

通过Apple 关于框架开发人员的技巧和技巧的文档阅读,我发现了关于指定初始化器的声明:

指定的初始值设定项是调用init超类方法的类的init方法 .(其他初始值设定项调用init 类定义的方法.)每个公共类都应该有一个或多个指定的初始值设定项.

(重点补充.)

基于我的理解 - 实际上,"指定"一词的使用 - 一个类应该只有一个指定的初始化器.但根据文档,可以接受多个指定的初始化程序.

假设您有两个(或更多)指定的初始值设定项,它们的作用是调用超类的指定初始值设定项,以保证正确的对象初始化.但是如果两个指定的初始值设定项都在调用同一个超类的指定初始化程序,那么为什么首先需要多个指定的初始化程序呢?不应该重构该类以将所有其他init方法汇集到单个指定的初始化器中吗?

关于什么用例或设计模式会调用多个指定的初始化器,我有点困惑?

cocoa cocoa-touch initializer cocoa-design-patterns ios

8
推荐指数
1
解决办法
1108
查看次数

"仅数据"Objective-C对象的更好替代方案?

我经常遇到这样的设计选择并且有点挣扎; 我正在寻找其他一些观点.

我经常想要保留列表,或者传递基本上只是一组值的状态块.值往往是原始类型:浮点数,NSTimeIntervals,CGPoints等.

我的第一个倾向通常是为这些属性集创建C结构,例如

typedef struct _STATE {
    float foo;
    NSTimeInterval elapsed;
    CGPoint point;
} STATE;
Run Code Online (Sandbox Code Playgroud)

等等

但C结构不具有天然可可集合类(发挥很好NSArray,NSSet,NSDictionary),并利用他们的overmany到的状态跟踪的感觉就像很多在运行对我的可可友好代码-其余的粮食我最终并直接管理结构数组,并在消息等中传递结构指针.

另一方面,由于原始性能不一定是关键的,我可以将这些值编码为NSDictionary,将它们全部包装在NSValue或中NSNumber,但结果语法几乎不简洁,有点脆弱,需要运行时的类型和名称正确性插入和查找:

[stateDict setObject:[NSNumber numberWithFloat:foo] forKey:@"bar"];
... 
float something = [[stateDict objectForKey:@"bar"] floatValue];
Run Code Online (Sandbox Code Playgroud)

并且某些类型(如NSTimeInterval)只能与某些(可论证的)hackery一起使用(在这种情况下,类型转换为double).

最后,我可以创建仅限数据的容器对象,包含私有成员数据,只有getter/setter.(这些在Java中被称为"bean".)这些比字典更容易访问,更多Cocoa而不是结构,但对我来说感觉有些过分,特别是如果我只需要它们作为用于状态管理的"内部类"单个对象类型的内部.

如何,伟大的Cocoa编程公众,这样做?

cocoa design-patterns objective-c nsdictionary cocoa-design-patterns

7
推荐指数
1
解决办法
2265
查看次数

保留"自我"的不良做法?

我有一个简单的查询,我想要被某人清理......保留自己是不是很糟糕?

我有一个服务器请求对象,我想做.我希望能够以下列方式使用它:

ARequest *request = [ARequest request: someParam];
request.delegate = self;
[request begin];
Run Code Online (Sandbox Code Playgroud)

为了让对象在自动释放池耗尽后不会自毁,我想我需要在它的init方法中调用retain,然后在收到,处理并传递给它的委托时响应服务器响应.

然而,有些事情正在用这种方法引起我的警钟.更好的方法吗?

iphone cocoa cocoa-touch cocoa-design-patterns

7
推荐指数
1
解决办法
1284
查看次数

从AppDelegate获取ManagedObjectContext时感到困惑

我一直在查看有关Core Data的文档,并试图找出如何安排Core Data Stack,以便所有UITableViewControllers都可以访问它.Apple提供的所有示例都表明这是在AppDelegate上实现的,但是文档并没有推荐这种方法,因为它太过曲折了!见链接.

(为什么在iPhone SDK文档中没有提到这是另一个谜)

我的问题是我按照TopSongs中显示的Core Data示例重复了设计模式,以检索子表视图的ManagedObjectContext实体,并生成以下错误...无法找到实体名称'Song'的NSManagedObjectModel.奇怪的是,这可以在父表视图中找到它,所以我认为这是因为AppDelegate上的核心数据堆栈已经被处理掉了.

有没有人知道一个很好的例子,它遵循与Recipies,CoreData Books和Locations上创建的设计模式不同的设计模式?所有这些都遵循相同的模式.

我想要做的就是检索原始数据,并在chid tableview中使用不同的标准进行排序.

iphone core-data cocoa-design-patterns

6
推荐指数
1
解决办法
7490
查看次数

将10 MB JSON响应转换为NSDictionary的最有效方法是什么?

我们的应用程序必须使用最少的远程http请求显示大量数据,因此我们在后端添加了一个端点,它将所有必要的数据作为单个json响应提供.这导致~1.5MB(压缩)或大约8 MB的未压缩的json格式文本.

没有太大问题,它会在10到30秒内下载,我们正在使用ASIHTTPRequest将整个响应写入磁盘.

现在是有趣的部分 - 在将未压缩文件读入内存映射字符串后,我们使用stig的json-framework将其转换为NSDictionary.这对我们的应用程序的其余部分以及其他API端点的典型2 KB json响应非常有效.但是,将这8 MB数据反序列化需要几秒钟(模拟器)到几分钟(3G和第二代iPod Touch).

我正在研究读取所有这些数据的最佳方法.

我很乐意使用直接从后端提供的二进制plist,但是我们使用Java并且我没有找到符合我们要求的合适库,并且在如此紧迫的期限内,编写我们自己可能不是最好的主意.

如果它以任何方式有帮助,我们正在解析的json字符串主要是X项的数组,如下所示:

{
    "items": [ { "key1": "value1", "key2": "value2" },
               { "key1": "value1", "key2": "value2" },
               { "key1": "value1", "key2": "value2" },
               { "key1": "value1", "key2": "value2" },
               { "key1": "value1", "key2": "value2" },
               { "key1": "value1", "key2": "value2" }
             ]
}
Run Code Online (Sandbox Code Playgroud)

将这个8 MB json格式的字符串读入内存中的NSDictionary的最有效方法是什么?

iphone json objective-c cocoa-design-patterns

6
推荐指数
1
解决办法
2376
查看次数

C++中的通知中心

在使用iOS和Mac目标C框架编程一段时间之后,我开始喜欢NSNotificationCenter和NSNotification类实现的通用通知模式.回到C++,它一直是我大多数事情的首选语言,我发现自己试图复制这种模式,并且相信应该真的已经存在类似C++类的通用实现,为它提供支持.

看起来这种模式在C++中比在Objective C中更难实现,因为后者的动态性更强,但这似乎是不可能的.我已经查看了升级库,因为它们通常很棒,很遗憾没有在那里找到我的运气.虽然boost :: bind,boost :: lamda,boost :: function看起来像是完成了大部分工作.我错过了一些明显的事吗?是否有任何已经存在的内容可以让我轻松复制NSNotification/NSNotificationCenter行为?

c++ notifications objective-c cocoa-design-patterns nsnotificationcenter

6
推荐指数
1
解决办法
1827
查看次数

从Swift中的多个ViewControllers收集数据

我有多个viewcontrollers(在导航堆栈中或可能没有),每个控制器根据用户输入收集一些数据.最后,我需要在最后一个控制器中使用这些数据.

那么实现这种情况的最佳方法/设计模式是什么?

architecture design-patterns cocoa-design-patterns ios swift

5
推荐指数
1
解决办法
509
查看次数