我正在尝试实现一个后台获取方法来获取新数据,但是它给了我一个NSMutable Dictionary错误。这是我的代码
在我的appDelegate中,在performFetchWithCompletionHandler下我有:
UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController;
id topViewController = navigationController.topViewController;
if ([topViewController isKindOfClass:[viewController class]])
{
[(viewController*)topViewController autologin];
}
else
{
completionHandler(UIBackgroundFetchResultNewData);
}
这会在我的视图控制器中调用自动登录
- (void) autologin
{
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
NSString* username = [defaults valueForKey:@"username"];
NSString* password = [defaults valueForKey:@"password"];
[self login:username password:password];
}
然后调用login
- (void)login:(NSString*)username password:(NSString*) password
{
NSDictionary *login = [[NSDictionary alloc] initWithObjectsAndKeys:username, @"username", password, @"password", NO, @"showNotification", nil];
NSOperationQueue* backgroundQueue = [NSOperationQueue new];
ch = [[backgroundProcess alloc] init];
NSInvocationOperation* operation = [[NSInvocationOperation alloc] initWithTarget:ch selector:@selector(runEvents:) object:login];
[backgroundQueue addOperation:operation];
operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(checkStatus) object:nil];
[backgroundQueue addOperation:operation];
}
如果我的应用程序在前台运行并且我调用了登录函数,那么一切正常,但是只要它点击就会执行performFetchWithCompletionHandler
NSDictionary *login = [[NSDictionary alloc] initWithObjectsAndKeys:username, @"username", password, @"password", NO, @"showNotification", nil];
我得到了EXC_BAD_ACCESS。任何帮助将不胜感激!
答案 0 :(得分:0)
不确定为什么你只是从后台崩溃。我看到的一个错误是你不能直接在字典中使用“NO”(标量BOOLEAN值)。 NSDictionary对象只能包含对象。您需要将NO值转换为NSNumber。使用最新版本的Objective C,您可以使用语法@(NO)将标量转换为NSNumber。这相当于
[NSNumber numberWithBool: NO];
我怀疑这是否是您崩溃的原因,但是您的代码中存在错误。
我不知道NSInvocationOperation的对象所有权规则是我的头脑。自从引入GCD以来,我没有使用过NSOperations或NSOperationQueues。您可能想要考虑使用基于GCD的调用。