无法执行方法insde dispatch_async()

时间:2015-03-21 17:38:44

标签: ios core-data queue grand-central-dispatch dispatch-async

我正面临一些我无法理解的事情。我正在下载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.
    });

}

} }

1 个答案:

答案 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];