根据NSManagedObjectContext类文档 ...
- (NSArray *)executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error
Run Code Online (Sandbox Code Playgroud)
回报价值
符合请求所指定条件的对象数组,该请求是从接收方和与接收方持久存储协调器关联的持久存储中获取的.如果发生错误,则返回nil.如果没有对象符合request指定的条件,则返回一个空数组.
我正在尝试为情况创建单元测试"如果发生错误,则返回nil."
我想远离使用OCMock(或子类化NSManagedObjectContext来覆盖executeFetchRequest:error:方法),因为我认为有一种简单的方法可以确保此方法失败.到目前为止我的单元测试读取...
- (void)testReportingCoreDataErrorToDelegate
{
NSManagedObjectContext *badContext = [[NSManagedObjectContext alloc] init];
[bcc setManagedObjectContext:badContext];
[bcc fetchFromCoreData];
STAssertTrue([mockDelegate didReceiveCoreDataError], @"This never asserts, it fails because the fetch request couldn't find an entity name - i.e. no managed object model");
}
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法来触发返回nil的获取请求?
我正在尝试复制Apple在视频播放中的行为,允许用户拉伸视频图像以填充边界.
@interface FHVideoPlayerView : UIView
@end
@interface FHVideoPlayerView
+ (Class)layerClass
{
return [AVPlayerLayer class];
}
- (void)setAspectMode:(FHVideoPlayerAspectMode)aspectMode animated:(BOOL)animated
{
FHVideoPlayerAspectMode current = [self aspectMode];
FHVideoPlayerAspectMode final = aspectMode;
NSString *fromValue;
NSString *toValue;
AVPlayerLayer *layer = (AVPlayerLayer *)[self layer];
switch (current) {
case FHVideoPlayerAspectFill:
fromValue = AVLayerVideoGravityResizeAspectFill;
break;
case FHVideoPlayerAspectFit:
fromValue = AVLayerVideoGravityResizeAspect;
break;
default:
break;
}
switch (final) {
case FHVideoPlayerAspectFill:
toValue = AVLayerVideoGravityResizeAspectFill;
break;
case FHVideoPlayerAspectFit:
toValue = AVLayerVideoGravityResizeAspect;
break;
default:
break;
}
if (toValue != fromValue) {
if …Run Code Online (Sandbox Code Playgroud) 在了解NSInvocations时,似乎我对内存管理的理解存在差距.
这是一个示例项目:
@interface DoNothing : NSObject
@property (nonatomic, strong) NSInvocation *invocation;
@end
@implementation DoNothing
@synthesize invocation = _invocation;
NSString *path = @"/Volumes/Macintosh HD/Users/developer/Desktop/string.txt";
- (id)init
{
self = [super init];
if (self) {
SEL selector = @selector(stringWithContentsOfFile:encoding:error:);
NSInvocation *i = [NSInvocation invocationWithMethodSignature:[NSString methodSignatureForSelector:selector]];
Class target = [NSString class];
[i setTarget:target];
[i setSelector:@selector(stringWithContentsOfFile:encoding:error:)];
[i setArgument:&path atIndex:2];
NSStringEncoding enc = NSASCIIStringEncoding;
[i setArgument:&enc atIndex:3];
__autoreleasing NSError *error;
__autoreleasing NSError **errorPointer = &error;
[i setArgument:&errorPointer atIndex:4];
// I understand that I need to …Run Code Online (Sandbox Code Playgroud) Web服务需要做什么才能使NSURLConnection's委托接收connection:didFailWithError:消息?
例如:iOS应用程序将令牌传递给Web服务,Web服务查找令牌,然后Web服务需要响应错误"无效令牌"或类似内容.
目前,接收数据,并在" connectionDidFinishLoading:"中解析错误消息.这意味着我在两个地方进行错误检查,我试图避免.
我完全掌控着iOS应用和网络服务.
我有一个iOS静态库,它定义了一个NSOperation客户端应该子类化的基类,以便将自己的逻辑添加到:@interface BaseClass : NSOperation
客户端向经理注册其子类: -[OperationManagerClass registerClass:forType:]
在经理中,我想强制你必须注册一个BaseClass不仅仅是的子类NSOperation
好吧,似乎断言+isSubclassOfClass:应该完成工作.但是......事实并非如此.
@implementation OperationManagerClass
- (void)registerClass:(Class)aClass forType:(NSString *)type
{
NSAssert([aClass isSubclassOfClass:[BaseClass class]);
self.registeredClasses[type] = aClass;
}
@end
Run Code Online (Sandbox Code Playgroud)
NO即使通过,断言总是如此BaseClass.
如何在班级层级中走得更远?NSOperation并且NSObject都回应YES!
(lldb) p (BOOL)[aClass isSubclassOfClass:[BaseClass class]]
(BOOL) $0 = NO
(lldb) po aClass
BaseClass
(lldb) p (BOOL)[aClass isSubclassOfClass:[NSOperation class]]
(BOOL) $2 = YES
(lldb) p (BOOL)[aClass isSubclassOfClass:[NSObject class]]
(BOOL) $3 = YES
Run Code Online (Sandbox Code Playgroud)
你要知道,基础操作类的消费者在iOS的应用程序项目继承,并OperationManagerClass与BaseClass处于包括静态库.为什么我认为这可能与isSubclassOfClass: …
当其他ObjC开发人员打破保留周期时,我经常看到这段代码片段.
__weak typeof(self) weakSelf = self;
[someObject doThingWithCompletion:^{
typeof(weakSelf) strongSelf = weakSelf;
[strongSelf awesomeThingOne];
[strongSelf moreAwesome];
}];
Run Code Online (Sandbox Code Playgroud)
为什么要使用typeof()宏?这是块的独特之处吗?
我最初的想法是,self类型可能不知道(这似乎大多不可能,但让我们假装......).如果类型是未知的,那么为什么不宣布weakSelf有id:__weak id weakSelf = self;?
我的第二个想法是它对子类化的防御,但这似乎不太可能导致问题.假设ObjTwo子类AwesomeObj并覆盖该awesomeThingOne方法.如果self是ObjTwo或的实例,上面的假代码应该可以正常工作AwesomeObj.
在使用Instruments之后,我发现我的代码中有一个很长时间运行并阻塞我的UI的地方:大量的Core Data提取(它是一个摄取大型JSON数据包并构建托管对象同时确保对象的过程的一部分没有重复).
虽然我的目的是将这个请求分解成更小的部分并按顺序处理它们,但这只意味着我将分散这些内容 - 我预计效果将是应用程序中的一小部分急动而不是一次长时间的打嗝.
我在Apple的文档和在线各种博客文章中都读过的所有内容都表明,核心数据和并发性类似于挖掘蜂巢.所以,胆怯地我坐下来给它上大学的尝试.以下是我提出的内容,我希望有人能够指出我确定写过的任何错误.
下面发布的代码有效.我读过的内容让我感到害怕,我肯定做错了什么; 我觉得如果把针从手榴弹中拔出来,我只是等着它意外地走了!
NSBlockOperation *downloadAllObjectContainers = [NSBlockOperation blockOperationWithBlock:^{
NSArray *containers = [webServiceAPI findAllObjectContainers];
}];
[downloadAllObjectContainers setCompletionBlock:^{
NSManagedObjectContext *backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[backgroundContext setPersistentStoreCoordinator:[_managedObjectContext persistentStoreCoordinator]];
[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification
object:backgroundContext
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note) {
[_managedObjectContext mergeChangesFromContextDidSaveNotification:note];
}];
Builder *builder = [[Builder alloc] init];
[builder setManagedObjectContext:backgroundContext];
for (ObjectContainer *objCont in containers) { // This is the long running piece, it's roughly O(N^2) yuck!
[builder buildCoreDataObjectsFromContainer:objCont];
}
NSError *backgroundContextSaveError = nil;
if ([backgroundContext hasChanges]) {
[backgroundContext save:&backgroundContextSaveError]; …Run Code Online (Sandbox Code Playgroud) 我想知道如果-viewWillAppear:没有匹配就会有任何方式被调用-viewDidAppear:.同上-viewWillDisappear和-viewDidDisappear.
我的问题的根源是注册和取消注册对象的KVO和/或NSNotifications的位置,更改通知将导致视图控制器更新视图.
例如,我有一个异步处理的模型对象,它的字符串属性可能会改变.我希望视图控制器能够KVO这些属性,并通过交换由所述视图控制器管理的标签的文本来反映任何更改.
您在哪里注册和取消注册通知?为什么?
编辑:
一个疑难杂症我遇到什么在应用程序状态变化的情况下(例如做-applicationWillResignActive,-...didEnterBackground等).这些更改似乎不会触发视图控制器生命周期方法.这里有什么最佳做法?
我有一个应用程序二进制文件,我想知道它是否针对iOS 5.x,6.x或7.0 SDK编译的。有可能解决这个问题吗?
有了NSArray和NSMutableArray的所有有用的东西,为什么你会使用带有Objective-C对象的"C Style"数组?
NSString *array[] = {@"dog", @"cat", @"boy"};
Run Code Online (Sandbox Code Playgroud) @interface ClassA : NSObject
@property (strong, nonatomic) dispatch_queue_t dispatchQ;
@property (strong, nonatomic) NSString *string;
@end
@implementation ClassA
- (id)init
{
self = [super init];
if (self) {
_dispatchQ = dispatch_queue_create("com.classa.q", NULL);
}
return self;
}
- (void)longRunningTaskWithCompletion:(void(^)(void))completion
{
dispatch_async(self.dispatchQ, ^{
for (int i = 0; i < 10000; i++) {
NSLog(@"%i", i);
}
dispatch_sync(dispatch_get_main_queue(), ^{
self.string = @"Class A Rocks!";
if(completion) {
completion();
}
});
});
}
@end
Run Code Online (Sandbox Code Playgroud)
我认为这段代码创建了一个保留周期,因为块在块中-longRunningTaskWithCompletion:捕获self(设置字符串属性)并将块添加到dispatch queue属性.
ios ×6
objective-c ×6
core-data ×2
arrays ×1
avfoundation ×1
c ×1
calayer ×1
concurrency ×1
ios5 ×1
nsinvocation ×1
retain-cycle ×1
unit-testing ×1
web-services ×1