我试图从我调用的类方法中返回一个bool值,该类方法中有一个块。我收到错误,不兼容的块指针类型发送....我怎么能解决这个问题?我只是想知道我调用的类方法是否有错误...
+ (BOOL)saveSelectedDepartmentsToParse:(NSMutableDictionary *)dictionary {
NSArray *array = [dictionary allKeysForObject:@"YES"];
NSMutableArray *trimmedArray = [[NSMutableArray alloc] init];
for (NSString *string in array) {
NSString *final = [string removeAllInvalidCharacters];
[trimmedArray addObject:final];
}
NSLog(@"Array = %@", trimmedArray);
PFInstallation *currentInstallation = [PFInstallation currentInstallation];
[currentInstallation removeObjectForKey:@"channels"];
[currentInstallation addObjectsFromArray:trimmedArray forKey:@"channels"];
[currentInstallation saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if (error == nil) {
NSLog(@"Parse Save Succeeded");
[self saveDepartmentsDictionary:dictionary];
}
else {
NSLog(@"Parse Save Failed, %@", error.localizedDescription);
}
}];
}
答案 0 :(得分:1)
我只想知道我调用的类方法
这是对异步代码如何工作的误解。当您向saveInBackgroundWithBlock:
提供块时,该代码不会立即执行。它是在Parse框架稍后执行的,如果块被定义为具有一个,那么Parse中的任何一个部分都将获得返回值。您的块不会在您编写它的位置执行,因此您无法在编写它时返回任何内容。
您的代码未调用该块,并且您无法从该代码返回值。这样做没有意义。如果代码的另一部分想知道保存何时完成,则需要使用除返回值之外的其他机制,例如从块中调用方法,发布通知或键值观察。
答案 1 :(得分:1)
来自阻止关键字InBackground
:
[currentInstallation saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if (error == nil) {
NSLog(@"Parse Save Succeeded");
[self saveDepartmentsDictionary:dictionary];
} else {
NSLog(@"Parse Save Failed, %@", error.localizedDescription);
}
}];
我猜这个块是异步调用的。
如果你想得到结果,可以在这里等到块执行,但这会使saveInBackgroundWithBlock
无用。
所以NSNotification可能会更好:
[currentInstallation saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if (error == nil) {
NSLog(@"Parse Save Succeeded");
[self saveDepartmentsDictionary:dictionary];
[[NSNotificationCenter defaultCenter] postNotificationName:kNotificationParseSaveSucceeded object:nil];
} else {
NSLog(@"Parse Save Failed, %@", error.localizedDescription);
[[NSNotificationCenter defaultCenter] postNotificationName:kNotificationParseSaveFailed object:nil];
}
}];