Uitableview从Internet获取异步数据,屏幕为空,直到超时或数据可用

时间:2011-04-28 17:01:24

标签: iphone ios ipad

我想让用户知道应用程序正在加载数据,所以我尝试了所有内容。

我刚刚添加了一个名为LoadingData的新视图,并将其放入我的Delegate中:

- (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];

}

这意味着我希望视图显示,直到与异步请求的连接完成.....

我只是尝试了一切,请帮忙。 但每次Async请求都会阻止视图中的所有内容

但我仍然首先看到空白页而没有


@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来说,如果它起作用,我会尽快发布....


所以我还有一个问题......

这是我的Appdelegate代码,我首先启动一个Loading Data视图,并在Thread完成后立即启动另一个视图.....

但仍然是空白的页面,为什么地狱仍然没有使用线程? 我知道我的代码不是最好的,但我只想先测试一下:

- (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 个答案:

答案 0 :(得分:1)

假设您的连接类不是异步的(尽管您认为是这样)......

您正在主UI线程上创建加载视图,在连接代码完成之前不会更新UI。

你应该剥离一个新线程来完成繁忙的工作。

[NSThread detachNewThreadSelector ...]

(void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;

您将在此处创建新的连接对象并执行冗长的工作。别忘了在那个帖子中创建一个NSAutoreleasePool。

这是一个参考

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

答案 1 :(得分:1)

好的,..在回答问题的下一部分时...我们在线程完成后更新主UI时遇到问题..这是使用Grand Central Dispatch的更好方法。 GCD为我们提供了没有复杂性的线程管道。它还允许我们访问不同线程的变量..

这个例子旋转了后台线程..然后当它完成时,它会在主线程上触发一段代码,这是我们需要更新UI的地方

 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


                                     });


                   });

答案 2 :(得分:0)

您应该使用ASIHTTPRequest来进行Web客户端工作,并且DEFINITELY应该使用异步方法。

这很简单:

__block ASIHTTPRequest *r = [ASIHTTPRequest requestWithUrl:myNSURLObject];
[r setCompletionBlock:^{
    //do whatever to process your received data
    [self.tableView reloadData];
}];
[r startAsynchronous];