Mysql 主线程中的NSURLSession
我正在尝试从MySQL下载数据。但是,当NSURLSession创建新线程时,数据尚未完全下载,因此主线程正在处理空值/崩溃。我使用了GCD的dispatch_async,但是它的速度慢了几毫秒 在我的测试程序中,我有两个nslog,一个直接在调用NSURLSession方法之后,另一个在方法本身中。输出(如下)显示NSURLSession延迟了30毫秒。虽然时间本身并不多,但它将对我如何安排任务产生巨大影响。有没有办法暂停主线程,直到数据下载完毕,方法完成 2014-03-30 18:56:06.224 TestProgram[1396:60b] (null) 2014-03-30 18:56:06.258 TestProgram[1396:60b] [{"error":200}] 2014-03-30 18:56:06.224测试程序[1396:60b](空) 2014-03-30 18:56:06.258测试程序[1396:60b][{“错误”:200}]Mysql 主线程中的NSURLSession,mysql,ios,multithreading,Mysql,Ios,Multithreading,我正在尝试从MySQL下载数据。但是,当NSURLSession创建新线程时,数据尚未完全下载,因此主线程正在处理空值/崩溃。我使用了GCD的dispatch_async,但是它的速度慢了几毫秒 在我的测试程序中,我有两个nslog,一个直接在调用NSURLSession方法之后,另一个在方法本身中。输出(如下)显示NSURLSession延迟了30毫秒。虽然时间本身并不多,但它将对我如何安排任务产生巨大影响。有没有办法暂停主线程,直到数据下载完毕,方法完成 2014-03-30 18:56:0
NSURLSessionConfiguration*defaultConfigObject=[NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession*defaultSession=[NSURLSession sessionWithConfiguration:defaultConfigObject委托:无委托队列:[NSOperationQueue mainQueue]];
NSURLSessionDataTask*dataTask=[DefaultSessionDataTaskWithRequest:urlRequest
completionHandler:^(NSData*数据,NSURLResponse*响应,NSError*错误)
{
如果(错误==nil)
{
dispatch\u async(dispatch\u get\u main\u queue()^{
NSString*text=[[NSString alloc]initWithData:数据编码:NSUTF8StringEncoding];
NSLog(@“%@”,文本);
n错误*错误;
self.json=[NSJSONSerialization JSONObjectWithData:data选项:NSJSONReadingAllowFragments错误:&error];
for(int i=0;i
查看NSURLSessionDataTask完成例程的文档。这似乎意味着数据在那时没有完全下载 我现在认为应该通知视图控制器中的一个代理数据已经下载,并相应地更新VC。想法?您永远不应该同步执行网络请求(即不要让主线程等待网络请求)。您应该向我们展示正在崩溃的代码,但总体思路是您启动需要网络请求的completionHandler
中的数据的任务,而不是在它之后。啊,干杯。它崩溃的原因是NSDictionary没有我要查找的名称的密钥。然后,查找这些词典条目的代码应该检查nil
,并适当地处理它(而不是尝试将网络请求更改为同步)。如果您使用同步请求,应用程序的响应速度会降低,并且可能会被看门狗进程终止。谢谢。然而,处理nil值并不能解决OP中讨论的直接问题。我之所以得到nil值是因为网络请求的延迟。需要启动一个新请求以引入所需数据的处理。这样做,我将启动一个不必要的新请求。谢谢你的意见。我将在上午输入委托方法。:)
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]];
NSURLSessionDataTask * dataTask =[defaultSession dataTaskWithRequest:urlRequest
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
if(error == nil)
{
dispatch_async(dispatch_get_main_queue(), ^{
NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
NSLog(@"%@",text);
NSError *error;
self.json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
for(int i =0 ; i < self.json.count ; i++)
{
[dataParse setDictionary:_json[i]];
}
});
} else {
NSLog(@"Response:%@ %@\n", response, error);
}
}];
[dataTask resume];