Webサービスにアクセスして取得したNSDataをNSArrayに変換したい。どうすればいいですか?
NSData から変換したい構造は次のとおりです。
NSArray:
NSDictionary1 : roomName departmentName
NSDictionary2 : roomName departmentName
NSDictionary3 : roomName departmentName
NSDictionary4 : roomName departmentName
NSDictionary5 : roomName departmentName
...
Web サービスの GetRoomList メソッドはリストを返します。リストの構造は上記のとおりです。コード:
- (void)viewDidLoad
{
[super viewDidLoad];
NSString *soapMessage = [NSString stringWithFormat:@"<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"><SOAP-ENV:Body><m:GetRoomList xmlns:m=\"http://http://portNumber/ilacDirektif.svc/\"><departId xsi:type=\"xsd:int\">0</departId><roomId xsi:type=\"xsd:int\">0</roomId></m:GetRoomList></SOAP-ENV:Body></SOAP-ENV:Envelope>"];
NSURL *url=[NSURL URLWithString:@"http://port number/ilacDirektif.svc/"];
NSMutableURLRequest *theRequest= [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30];
NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];
[theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[theRequest addValue: @"http://tempuri.org/ilacDirektif.svc" forHTTPHeaderField:@"SOAPAction"];
[theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"];
[theRequest setHTTPMethod:@"POST"];
[theRequest addValue:@"port number" forHTTPHeaderField:@"Host"];
[theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
NSURLResponse* response = nil;
NSData *data =[NSURLConnection sendSynchronousRequest: theRequest returningResponse: &response error: nil];
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:data];
if(array){NSLog(@"%@",array); }else{ NSLog(@"Failed"); }
if (data) {NSLog(@"%@",data);} else { NSLog(@"Failed");}
}
エラー:
2013-05-31 09:59:45.208 IlacOrder[18513:11303] -[__NSCFData getFileSystemRepresentation:maxLength:]: 認識されないセレクターがインスタンス 0x7560860 に送信されました 2013-05-31 09:59:45.222 IlacOrder[18513:11303] * アプリの終了キャッチされない例外 'NSInvalidArgumentException' のため、理由: '-[__NSCFData getFileSystemRepresentation:maxLength:]: 認識されないセレクターがインスタンス 0x7560860 に送信されました' *First throw call stack: (0x1c8e012 0x10cbe7e 0x1d194bd 0x1c7dbbc 0x1c7d94e 0xacc7b4 0xacc762 0xafac85 0xb22c7a 0x2a55 0xf4817 0xf4882 0xf4b2a 0x10bef5 0x10bfdb 0x10c286 0x10c381 0x10ceab 0x10d4a3 0x10d098 0x2460 0x10df705 0x16920 0x168b8 0xd7671 0xd7bcf 0xd6d38 0x4633f 0x46552 0x243aa 0x15cf8 0x1be9df9 0x1be9ad0 0x1c03bf5 0x1c03962 0x1c34bb6 0x1c33f44 0x1c33e1b 0x1be87e3 0x1be8668 0x1365c 0x1ded 0x1d15 0x1 ) libc++abi.dylib: 例外をスローして呼び出された終了
.svc の関数:
public List<DepartmentRoom>GetRoomList(int roomId,int departId()){
return manager.GetRoomList(roomId,departId);
}
GetRoomList:
public List<DepartmentRoom> GetRoomList(int departId,int roomId){
var cmd = OracleHelper.GetOracleCommand(_conn, StoredProcedure.Procedure1);
if (_conn.State == ConnectionState.Closed)
_conn.Open();
OracleCommandBuilder.DeriveParameters(cmd);
cmd.Parameters["P_DEPARTID"].Value = departId;
cmd.Parameters["P_ROOMID"].Value = roomId;
OracleDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
object o = cmd.Parameters["P_REF"].Value;
var roomList = new List<DepartmentRoom>();
while (dr.Read())
{
var departmentRoom = new DepartmentRoom
{
DepartId = Convert.ToInt32(dr["DEPARTID"]),
DepartmentName = dr["DEPART"].ToString(),
RoomId = Convert.ToInt32(dr["ROOMID"]),
RoomName = dr["ROOM"].ToString()
};
roomList.Add(departmentRoom);
}
return roomList;
}