Uitableview получает асинхронные данные из Интернета, экран остается пустым до истечения времени ожидания или доступных данных - PullRequest
0 голосов
/ 28 апреля 2011

Я хочу, чтобы пользователь знал, что приложение загружает данные, поэтому я попробовал все.

Я просто добавил новое представление с именем LoadingData и поместил его в свой делегат:

- (void)applicationDidFinishLaunching:(UIApplication *)application {    


LoadingData *loadingDataView = [[LoadingData alloc] initWithNibName:@"LoadingData" bundle:nil];

[window addSubview:[loadingDataView view]];

[window makeKeyAndVisible];



Connection *connection = [[Connection alloc] init];
[connection getUserDefaults];



[window addSubview:[navigationController view]];

[window makeKeyAndVisible];

}

Это означает, что я хочу, чтобы представление отображалось до тех пор, пока соединение с асинхронным запросом не будет завершено .....

Я только что попробовал все, пожалуйста, помогите.Но каждый раз, когда асинхронный запрос блокирует все в представлении

Но я все равно сначала вижу пустую страницу и не


@ albertamg

Это мой метод подключения:

-(BOOL) connectAsync
{

    // ==== BEGIN DEBUGGING OUTPUT
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:
                                self.url];

    [request setTimeoutInterval:20];

    NSLog(@"request :  %@", request);
    // [request setValue:agentString forHTTPHeaderField:@"User-Agent"];

    NSError        *error = nil;
    NSURLResponse  *response = nil;


    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];


    NSLog(@"Connection Error:      %@", error);
    //NSLog(@"Code:   %@", [error code]);
    NSLog(@"UserInfo: %@", [error userInfo]);
    NSLog(@"Domain: %@",  [error domain]);

    NSLog(@"HelpAnchor: %@", [error helpAnchor]);

    NSLog(@"Connection Response: %@", response);


    if(error !=nil)
    {
        return NO;
    }
    else
    {

        NSString *returnData = [[NSString alloc] initWithBytes: [data bytes] length:[data length] encoding: NSUTF8StringEncoding];
        NSLog(@"returnData:  %@", returnData); 
        // === END DEBUGGING OUTPUT
        return YES;

    }

}

Я постараюсь использовать Threads в качестве следующего шага, спасибо JAson Cragun, я напишу как можно скорее, сработало или нет ....


Так что я все ещеУ меня проблема с этим ....

Вот мой код для приложения Applelegate, я сначала запускаю представление «Загрузка данных» и запускаю другое представление, как только завершается поток .....

Но все еще пустая страница, почему, черт возьми, он все еще не работает с темой?Я знаю, что мой код не самый лучший, но сначала я хочу его протестировать:

- (void)applicationDidFinishLaunching:(UIApplication *)application {    


LoadingData *loadingDataView = [[LoadingData alloc] initWithNibName:@"LoadingData" bundle:nil];

[window addSubview:[loadingDataView view]];

[window makeKeyAndVisible];

Connection *connection = [[Connection alloc] init];
[connection getUserDefaults];



NSThread *connectThread = [[NSThread alloc] initWithTarget:(connection) selector:@selector(connectAsyncThread) object:nil];


[connectThread start]; 

while ([connectThread isExecuting]) 
{
    NSLog(@"WAit for Thread.....");
}

if (![connectThread isExecuting]) {
    [window addSubview:[navigationController view]];


    [window makeKeyAndVisible];
}

}

Ответы [ 3 ]

1 голос
/ 29 июня 2011

Хорошо, ... в ответ на следующую часть вопроса ... у нас возникли проблемы с обновлением основного интерфейса ПОСЛЕ того, как завершился поток ... вот лучший подход с использованием Grand Central Dispatch. GCD дает нам возможности для потоков без всяких сложностей .. он также дает нам доступ к переменным в разных потоках ..

этот пример раскручивает фоновый поток .. затем, когда он закончил, он запускает блок кода в главном потоке, где мы должны обновить пользовательский интерфейс

 dispatch_queue_t q = dispatch_get_global_queue(0, 0);
    dispatch_queue_t main = dispatch_get_main_queue();

    dispatch_async(q, ^
                   {
                       //do background work here

                       dispatch_sync(main, ^
                                     {


                                         // update UI here


                                     });


                   });
1 голос
/ 28 апреля 2011

при условии, что ваш класс соединения не является асинхронным (хотя вы думаете, что это так) ...

Вы создаете представление загрузки в главном потоке пользовательского интерфейса, которое не будет обновлять пользовательский интерфейс до тех пор, пока код соединения не будет завершен.

Вы должны выделить новый поток, чтобы выполнить занятую работу.

[NSThread detachNewThreadSelector ...]

(void) detachNewThreadSelector: (SEL) селектор toTarget :(id) target withObject: (id) аргумент;

, где вы создадите новый объект подключения и выполните длительную работу.Не забудьте создать NSAutoreleasePool в этом потоке.

вот ссылка

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/Introduction/Introduction.html

0 голосов
/ 29 июня 2011

Вы должны использовать ASIHTTPRequest для работы вашего веб-клиента, и ОБЯЗАТЕЛЬНО должны использовать асинхронные методы для этого.

Это так же просто, как:

__block ASIHTTPRequest *r = [ASIHTTPRequest requestWithUrl:myNSURLObject];
[r setCompletionBlock:^{
    //do whatever to process your received data
    [self.tableView reloadData];
}];
[r startAsynchronous];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...