0

現在、次のコードを使用してビュー間の遷移をアニメーション化しています。refreshTheServersその間にメソッドが呼び出されると、アプリケーション全体がフリーズし、サーバーが更新され、ビューが表示されます。

ビューがロードされてからサーバーが更新されるシームレスなプロセスにするにはどうすればよいですか?

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:NO];
[self.view addSubview:self.folderView];
[UIView commitAnimations];
[self refreshTheServers];

編集: refreshTheServers メソッドのコードは次のとおりです。

- (void)refreshTheServers {

KeychainItemWrapper* keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"KeychainTest" accessGroup:nil];

NSString *userForConnect = [NSString stringWithFormat:@"%@", [keychain objectForKey:(__bridge id)(kSecAttrAccount)]];
NSString *passForConnect = [NSString stringWithFormat:@"%@", [keychain objectForKey:(__bridge id)(kSecValueData)]];



CTCoreAccount *account = [[CTCoreAccount alloc] init];

dispatch_queue_t taskQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(taskQ, ^{
    [account connectToServer:[[NSUserDefaults standardUserDefaults]
                              stringForKey:@"server"]
                        port:993
              connectionType:CTConnectionTypeTLS
                    authType:CTImapAuthTypePlain
                       login:userForConnect
                    password:passForConnect];

    dispatch_async(dispatch_get_main_queue(), ^{
        // ... the thread is over, do stuff on the main thread ...

        CTCoreFolder *inbox = [account folderWithPath:theAppDelegate.folder];

        NSArray *inboxMessages = [inbox messagesFromUID:1 to:0 withFetchAttributes:CTFetchAttrEnvelope];

        [[self allMessages] removeAllObjects];
        [[self allMessages] addObjectsFromArray:inboxMessages];

        [self.messagesTable reloadData];
    });
});
}

私は何を間違っていますか?

4

1 に答える 1

0

次の呼び出しは同期的です: [inbox messagesFromUID:1 to:0 withFetchAttributes:CTFetchAttrEnvelope]; そのため、アプリケーションがフリーズします。インスツルメントの CPU サンプラーはそれを際立たせる可能性があります。

于 2013-04-28T23:15:58.817 に答える