提高代码执行速度

时间:2012-06-07 10:56:12

标签: objective-c ios multithreading objective-c-blocks

我的代码存在一些问题,不知道如何加快速度。这是来自app delegate的代码(didFinishLaunchingWithOptions方法体):

initialized = [[NSUserDefaults standardUserDefaults] boolForKey:@"initialized"];

if (!initialized) {
     dispatch_queue_t queue = dispatch_get_global_queue(
                                                       DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);


    dispatch_async(queue, ^{
        [DAO setDocumentsCacheDirectory:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]];

        ....download images and files needed by application

        NSLog(@"%@", @"Finished downloadding images and files");

        [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshView" object:nil];
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"initialized"];
    });
}

在发生异步下载的同时,我在我的视图中使用gif图像。正如您所看到的,完成所有这些下载后,我的视图控制器中会触发refreshView方法。

加载完成后重新加载我有NSLog(@“%@”,@“完成重装......”);所以我知道视图何时重新加载。

问题:

所以我正在看控制台:

2012-06-07 12:52:34.898 TestApp[29800:13c03] Finished downloadding images and files
[Switching to process 29800 thread 0x13c03]
2012-06-07 12:52:34.909 TestApp[29800:13c03] Finished reloading..

文件下载似乎在一两秒内完成。然后立即通过时间戳看到视图重新加载完成。

但事情是应用程序等待5秒左右,我不知道在哪里和正在发生什么,只有当视图重新刷新,尽管消息完成重新加载..大约5秒前显示。

接下来你会做什么?

1 个答案:

答案 0 :(得分:5)

您正在后台队列中发布通知 - 如果这是触发UI更新的内容,那么这需要在主队列上完成:

dispatch_async(queue, ^{
    [DAO setDocumentsCacheDirectory:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]];

    ....download images and files needed by application

    NSLog(@"%@", @"Finished downloadding images and files");

    dispatch_sync(dispatch_get_main_queue(), ^{
        [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshView" object:nil];
    }

    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"initialized"];
});

注意我在这里使用了dispatch_sync ......在主队列块完成之前,NSUserDefaults将不会更新。