我只是想了解构建我的第一个Core Data应用程序的最佳方法,以及我将需要的主要对象和交互.
数据远程存储,我需要通过HTTP访问它,它将以JSON格式响应.我想使用Core Data在设备上缓存它.每天服务器上都会有新数据,因此我需要访问它并相应地更新模型.
是否有任何SDK类可以用来帮助我解决这个问题,或者我会手动推出它?
我想我正在看一个模型控制器,我调用它来获取数据,它将返回核心数据缓存数据,并可能对Web服务进行后台调用以获取最新数据,然后通知视图有新的数据.当我以JSON格式从Web服务获取数据时 - 我需要将此映射到ManagedObjects,这是对我的核心数据上下文的添加.
我在llvm网站上阅读ARC文档:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#autoreleasepool
..尤其是@autoreleasepool.
在使用NSAutoreleasePool的许多当前实现中,我看到在循环迭代期间池被定期耗尽的情况 - 我们如何使用@autorelease池执行相同的操作,或者是否已经在某种程度上为我们完成了这些操作?
其次,文档说明如果抛出异常,池就不会耗尽......好的例外是名称异常,但是如果它们确实发生了,你可能希望在不泄漏大量内存的情况下恢复.文档未指定何时释放这些对象.
任何人都有关于这些点的任何信息?
我的所有视图控制器都扩展了我自己的BaseViewController:UIViewController,在这里我已经被覆盖了
- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers {
return NO;
}
Run Code Online (Sandbox Code Playgroud)
但是,iOS 5模拟器决定忽略这一点并继续在我的嵌套UIViewController层次结构上调用我的viewWillAppear等方法.
我在另一个项目中做了同样的事情并且运行良好.是否还有其他东西让我听到它?
使用一些代码,我遇到了运行循环,我是新手,在NSOperations 里面.
他们NSOperation正在忙于下载数据 - 当他们忙碌时,会有代码等待下载完成,以NSRunLoops和线程休眠的形式.
我特别感兴趣的是这段代码:
while (aCertainConditionIsTrue && [self isCancelled]==NO) {
if(![[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1.0]]){
[NSThread sleepForTimeInterval:1.0];
}
}
Run Code Online (Sandbox Code Playgroud)
我已经阅读了关于运行循环的信息,runMode:beforeDate:并将等待输入源或超时.虽然我不是百分之百的东西.
在第一次执行时,它总是返回NO并命中sleepForTimeInterval:.这不好吗?
在一个特定的实用程序类中,它经常会sleepForTimeInterval:遇到很多 - 每个线程一次 - 这会严重损害性能.
对此有什么更好的解决方案或建议吗?
objective-c nsoperation grand-central-dispatch nsrunloop ios
我不知道我做了什么,这是多长时间(因为我已经忍受了一段时间)...但我在Xcode的调试器中丢失了我的堆栈跟踪...有点.下面是我的应用程序崩溃时看到的屏幕截图:

在控制台中我看到了这个:

所以我可以弄清楚控制台出了什么问题,但我错过了我可以点击类文件并跳转到崩溃源的堆栈跟踪.
它可能是LLDB吗?最新的Xcode?还有什么东西吞噬了我的异常?有任何想法吗?
围绕这个主题存在各种各样的问题,并且许多建议说不要在dispatch_async中使用sendSynchronousRequest,因为它会阻塞线程,并且GCD将产生许多新的工作线程来为所有同步URL请求提供服务.
似乎没有人对iOS 5,[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]在幕后做什么有明确的答案.
我读过的一篇文章指出它可能"优化",并且"可能"使用运行循环 - 但肯定不会为每个请求创建一个新线程.
当我在使用sendAsynchronousRequest:queue:completionHandler时暂停我的调试器时,堆栈跟踪如下所示:

..现在看来sendAsynchronousRequest:queue:completionHandler实际上正在调用sendSynchronousRequest,当我使用async方法而不是sync方法时,我仍然创建了大量的线程.
是的,使用异步调用还有其他好处,我不想在这篇文章中讨论.
所有我感兴趣的是性能/线程/系统使用,如果我更糟糕的是在dispatch_async中使用同步调用而不是使用异步调用.
我也不需要使用ios4异步调用的建议,这纯粹是出于教育目的.
有没有人对此有任何有见地的答案?
谢谢
dataUpdated |= [backgroundApplicationData downloadLinks];
Run Code Online (Sandbox Code Playgroud)
这个Or/Equal是什么意思?从未见过它.
我熟悉委托模式和nilling我的委托,特别是在我的视图控制器消失时仍在进行的异步调用时.我没有委托,并且回调成功返回nil对象.
我现在正在尝试使用完成块来使我的代码更容易阅读.
我从视图控制器调用网络服务,并传递一个更新我的UITableView的块.在正常情况下它工作正常.但是,如果我在视图完成之前离开视图,则执行完成处理程序块 - 但是UITableView现在是一个僵尸.
什么是处理这个的通常模式?
更新代码示例
这是一个iPad应用程序,我在屏幕上同时有两个视图控制器,就像拆分视图一样.一个是细节,另一个是图像网格.我点击一个图像,它告诉细节加载信息.但是,如果我在他们有机会进行网络通话之前点击图像太快 - 我有问题.在更改图像时,会调用下面的代码来计算图像的最爱....
所以这就是我的困境,如果我使用下面的代码 - 它工作正常,但如果你在网络响应之前切换图像,它会在仪器中泄漏.
如果我删除__block并传入self,那么它会与僵尸一起崩溃.
我无法获胜......我确信我错过了使用积木的基本原则.
__block UITableView *theTable = [self.table retain];
__block IndexedDictionary *tableData = [self.descriptionKeyValues retain];
FavouritesController *favourites = [Container controllerWithClass:FavouritesController.class];
[favourites countFavouritesForPhoto:self.photo
completion:^(int favesCount) {
[tableData insertObject:[NSString stringWithFormat:@"%i", favesCount]
forKey:@"Favourites:" atIndex:1];
[theTable reloadData];
[tableData release];
[theTable release];
}];
Run Code Online (Sandbox Code Playgroud)
有小费吗?谢谢
第二次更新
我改变了加载收藏夹的方式.我不是将收藏夹作为单身人物,而是在每次照片更改时创建一个实例.通过替换它并杀死旧的 - 块无处回调(我猜它甚至不存在),我的代码现在看起来像下面的,它似乎工作:
[self.favourites countFavouritesForPhoto:self.photo
completion:^(int favesCount) {
[self.descriptionKeyValues insertObject:[NSString stringWithFormat:@"%i", favesCount]
forKey:@"Favourites:" atIndex:1];
[self.table reloadData];
}];
Run Code Online (Sandbox Code Playgroud)
它不会泄漏,也不会崩溃.
当我启动我的应用程序时,底部布局指南具有这些尺寸;
<_UILayoutGuide:0xd687730; frame =(0 519; 0 49); hidden = YES; layer =>
这是正确的,因为我的标签栏有一个不透明的自定义背景.视图控制器的内容是表视图.
但是,当我转到下一个标签并返回时,底部布局已更改:
<_UILayoutGuide:0xd687730; frame =(0 568; 0 0); hidden = YES; layer =>
是什么改变了这个以及为什么?请给我任何线索.
这是我的代码:
if let runningTests = NSClassFromString("XCTestCase") {
return false
}
Run Code Online (Sandbox Code Playgroud)
编译器警告:
"常量'runningTests'被推断为具有'AnyClass'类型,这可能是意料之外的.
我需要强制转换为删除此警告而不将我的代码更改为if!= nil检查NSClassFromString的结果是什么?
ios ×7
objective-c ×6
architecture ×1
autolayout ×1
c ×1
core-data ×1
exception ×1
ios5 ×1
iphone ×1
llvm ×1
nsoperation ×1
nsrunloop ×1
stack-trace ×1
swift ×1
xcode ×1