我想让用户知道应用程序正在加载数据,所以我尝试了所有内容。
我刚刚添加了一个名为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];
}
}
答案 0 :(得分:1)
假设您的连接类不是异步的(尽管您认为是这样)......
您正在主UI线程上创建加载视图,在连接代码完成之前不会更新UI。
你应该剥离一个新线程来完成繁忙的工作。
[NSThread detachNewThreadSelector ...]
(void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
您将在此处创建新的连接对象并执行冗长的工作。别忘了在那个帖子中创建一个NSAutoreleasePool。
这是一个参考
答案 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];