2014-03-01 32 views
0

在另一个SO专家用户的帮助下,我实现了一种方法将viewController连接到远程PHP文件,以更新MySQL字段值并使其更新为UILabelJSON从PHP到iOS和从UILabel更新

我从PHP文件回显的JSON值是这种格式:[“34”]。

这是该方法:

- (IBAction)votarAction:(id)sender { 
    //URL definition where php file is hosted 
    dispatch_queue_t backgroundQueue = dispatch_queue_create("com.mycompany.myqueue", 0); 

    dispatch_async(backgroundQueue, ^{ 

     int categoriaID = [[detalleDescription objectForKey:@"idEmpresa"] intValue]; 

     NSString *string = [NSString stringWithFormat:@"%d", categoriaID]; 
     NSLog(@"ID EMPRESA %@",string); 
     NSMutableString *ms = [[NSMutableString alloc] initWithString:@"http://mujercanariasigloxxi.appgestion.eu/app_php_files/cambiarvaloracionempresa.php?id="]; 
     [ms appendString:string]; 
     // URL request 
     NSLog(@"URL = %@",ms); 
     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:ms]]; 
     //URL connection to the internet 
     NSData *responseData = [[NSURLConnection alloc]initWithRequest:request delegate:self]; 
     NSLog(@"responseData= %@",responseData); 

     //Parse JSON 
     NSError *error = nil; 
     NSArray * json = [NSJSONSerialization 
             JSONObjectWithData:responseData 
             options: NSJSONReadingMutableContainers 
          error: &error];   

     int valoracionNumber = [[json objectAtIndex:0] integerValue];  



     dispatch_async(dispatch_get_main_queue(), ^{ 
      //update your label 

      NSString *labelValue = [NSString stringWithFormat:@"%d", valoracionNumber]; 
      self.valoracionLabel.text = labelValue; 
     });  
    }); 
} 

这是抛出的异常:

2014-02-28 22:45:16.921 Vive Gran Canaria[928:582b] responseData= <NSURLConnection: 0xf050bc0> { request: <NSURLRequest: 0x9de3d40> { URL: http://mujercanariasigloxxi.appgestion.eu/app_php_files/cambiarvaloracionempresa.php?id=25 } } 
2014-02-28 22:45:16.922 Vive Gran Canaria[928:582b] -[NSURLConnection bytes]: unrecognized selector sent to instance 0xf050bc0 
2014-02-28 22:45:16.947 Vive Gran Canaria[928:582b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSURLConnection bytes]: unrecognized selector sent to instance 0xf050bc0' 
*** First throw call stack: 
(
    0 CoreFoundation      0x00fca5e4 __exceptionPreprocess + 180 
    1 libobjc.A.dylib      0x02c5c8b6 objc_exception_throw + 44 
    2 CoreFoundation      0x01067903 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275 
    3 CoreFoundation      0x00fba90b ___forwarding___ + 1019 
    4 CoreFoundation      0x00fba4ee _CF_forwarding_prep_0 + 14 
    5 Foundation       0x029a308c -[_NSJSONReader findEncodingFromData:withBOMSkipLength:] + 36 
    6 Foundation       0x029a323b -[_NSJSONReader parseData:options:] + 63 
    7 Foundation       0x029a3800 +[NSJSONSerialization JSONObjectWithData:options:error:] + 161 
    8 Vive Gran Canaria     0x00009bca __44-[DetalleEmpresaViewController votarAction:]_block_invoke + 602 
    9 libdispatch.dylib     0x02f5b7f8 _dispatch_call_block_and_release + 15 
    10 libdispatch.dylib     0x02f704b0 _dispatch_client_callout + 14 
    11 libdispatch.dylib     0x02f5e07f _dispatch_queue_drain + 452 
    12 libdispatch.dylib     0x02f5de7a _dispatch_queue_invoke + 128 
    13 libdispatch.dylib     0x02f5ee1f _dispatch_root_queue_drain + 83 
    14 libdispatch.dylib     0x02f5f137 _dispatch_worker_thread2 + 39 
    15 libsystem_c.dylib     0x03288e72 _pthread_wqthread + 441 
    16 libsystem_c.dylib     0x03270daa start_wqthread + 30 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException (lldb) 

这是部件从PHP文件呼应JSON数组:

$arr = array(); 

$rs = mysql_query("SELECT * FROM tbempresas where idEmpresa='$id'"); 
while ($obj = mysql_fetch_assoc($rs)) { 
    $arr[] = $obj['valoracionEmpresa']; 
} 
echo json_encode($arr); 

回答

2

您必须创建一个对象NSURLConnection而不是NSData,作为回应,您将获得NSURLConnection的委托方法中的数据。

NSURLConnection *connection=[[NSURLConnection alloc]initWithRequest:request delegate:self];  

#pragma NSURLConnection Delegate Methods 
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    //buffer is the object Of NSMutableData and it is global,so declare it in .h file 
    buffer = [NSMutableData data]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [buffer appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    //Here You will get the whole data 
    NSArray *array = [NSJSONSerialization JSONObjectWithData:buffer options:0 error:&jsonParsingError]; 
    //And you can used this array 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    //if any error occurs.. 
} 
+0

谢谢,我认为你是对的,但是在你的代码中有一些小问题。在行[buffer appendData:data];有一个编译器警告::'data'的本地声明隐藏了实例变量。第二个问题是connectionDidFinishLoading永远不会被调用。我已经在那里放了一个NSLog,并没有出现在日志应用程序。 – mvasco

+0

对于第一期: 你也采取了全局数据的实例名称,它的名字与委托方法类似,这就是为什么它显示警告。所以请改变全局实例变量的名称,即'webData'而不是'data ”。 并可以详细说明第二期? – Arpit

+0

谢谢Arpit,我解决了第一个问题。第二个问题是connectionDidFinishLoading方法永远不会被调用。我已经在那里放了一个NSLog来检查它,并且在执行应用程序时不会显示它。 – mvasco

1

这段代码有很多错误。让我们先从这一行:

NSData *responseData = [[NSURLConnection alloc]initWithRequest:request delegate:self]; 

,将返回的NSURLConnection一个实例,但你在被指派给NSData变量。这意味着对NSURLConnection如何工作的根本性误解。由于您使用的是initWithRequest:delegate:,因此连接将异步处理,这意味着您将无法在votarAction:内更新您的标签。

您将需要实现NSURLConnectionDataDelegate协议中的一些方法来读取数据。一旦检测到连接已关闭,您可以处理数据并将其写入标签。

在您需要实现最起码

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 

要获得responseData。你应该真的实现额外的委托方法来处理响应状态,失败等......或者,只是去使用AFNetworking,并忘记了大部分这些细节,直到以后。