我正面临一些我无法理解的事情。我正在下载json数据并使用返回值实例化Core Data对象(在dispatch_async(get_main_queue)内)。在完成所有操作但我的tableviewcontrollers未被调用之后,我尝试呈现另一个视图(使用包含这些对象的tableView)。但是,如果我从这个块之外的方法(在connectionDidFinishing NSURLConnection内部)中呈现我的viewController,一切正常。
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
id jsonObject = [NSJSONSerialization JSONObjectWithData:_downloadedData options:NSJSONReadingAllowFragments error:&error];
if ([jsonObject isKindOfClass:[NSArray class]]) {
NSArray *deserializedArray = (NSArray *)jsonObject;
if (deserializedArray.count > 0) {
dispatch_async(dispatch_get_main_queue(), ^{
for (NSDictionary *jsonElement in deserializedArray)
{
// Create a new location object and set its props to JsonElement properties
Patient *syncPatient = [[PatientStore sharedStore] createPatient];
syncPatient.firstName = jsonElement[@"firstname"];
syncPatient.lastName = jsonElement[@"lastname"];
}
});
[self login]; // --> does not work.
}
}
}
[自我登录]不起作用。但是如果我从didFinishLoading方法之外调用它,它就可以工作。
我必须考虑dispatch_async(),但我不知道如何从外部自动调用此方法(例如使用"我已完成"通知)。
有人可以提供帮助吗?
非常感谢!
更新
它在块内部都不起作用。看起来[自登录]发生在for循环指令之前。
if (deserializedArray.count > 0) {
dispatch_async(dispatch_get_main_queue(), ^{
for (NSDictionary *jsonElement in deserializedArray)
{
// Create a new location object and set its props to JsonElement properties
Patient *syncPatient = [[PatientStore sharedStore] createPatient];
syncPatient.firstName = jsonElement[@"firstname"];
syncPatient.lastName = jsonElement[@"lastname"];
}
[self login]; // --> does not work either here. As if it was executed before what is inside the for loop.
});
}
} }
答案 0 :(得分:0)
[self login]
,因为它在块之外。如果你把它放进去,它会在循环结束后执行。
您可以使用一个简单的命令行项目对此进行测试,该内容位于main.swift:
中import Foundation
dispatch_async(dispatch_get_main_queue()) {
var j = 0
for _ in 1...1000 { j++ }
println("The value of j is \(j).")
}
dispatch_main()
输出:The value of j is 1000.
在循环之后,println
显然已执行。
创建对象后,不要忘记保存:
[managedObjectContext save:nil];