Взаимодействие iPhone с ASP.NET WebService

Строки в Java неизменяемы. Это означает, что всякий раз, когда вы пытаетесь изменить / изменить строку, вы получаете новый экземпляр. Вы не можете изменить исходную строку. Это сделано для того, чтобы эти экземпляры строк могли кэшироваться. Типичная программа содержит множество ссылок на строки и кеширование этих экземпляров, что может уменьшить объем памяти и увеличить производительность программы.

При использовании оператора == для сравнения строк вы не сравниваете содержимое строки , но фактически сравнивают адрес памяти. Если они равны, в противном случае они вернут true и false. Если значение равно в строке, сравнивает содержимое строки.

Итак, вопрос в том, что все строки кэшируются в системе, как получается == возвращает false, тогда как equals возвращает true? Ну, это возможно. Если вы создадите новую строку, например String str = new String("Testing"), вы создадите новую строку в кеше, даже если в кеше уже содержится строка с тем же содержимым. Короче говоря, "MyString" == new String("MyString") всегда будет возвращать false.

Java также говорит о функции intern (), которая может использоваться в строке, чтобы сделать ее частью кеша, поэтому "MyString" == new String("MyString").intern() вернет true.

Примечание: == оператор намного быстрее, чем равен только потому, что вы сравниваете два адреса памяти, но вы должны быть уверены, что код не создает новые экземпляры String в коде. В противном случае вы столкнетесь с ошибками.

13
задан Community 23 May 2017 в 10:27
поделиться

5 ответов

Вы действительно можете создать веб-службу и упростить ее интеграцию в ваш iphone. Я бы посоветовал, если вы используете .net для создания службы WCF с торговлей webHttp и реализуете методы get и post, вы можете получать ответы обратно в json и xml (есть набор классов для синтаксического анализа Json на iphone, который будет выполнять синтаксический анализ ответьте легко, они доступны в Интернете), с небольшой настройкой вы сможете выполнять получение и публикацию с iphone с помощью NSURLRequest. Вот статья, в которой рассказывается о создании спокойной службы wcf http://www.developer.com/net/article.php/10916_3695436_2 . Также очень легко добавить аутентификацию и безопасность к вашим службам с помощью WCF.

20
ответ дан 1 December 2019 в 20:57
поделиться
- (void)viewDidLoad {
[super viewDidLoad];

// create a soap Message which is given in your required web service

NSString *soapMessage=@"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
"<soap:Body>\n"
"<GetCategory xmlns=\"http://tempuri.org/\" />\n"
"</soap:Body>\n"
"</soap:Envelope>";

// create a url to your asp.net web service.
NSURL *tmpURl=[NSURL URLWithString:[NSString stringWithFormat:@"http://192.168.32.10/Itavema/Admin/Itavema_Service.asmx"]];

// create a request to your asp.net web service.
NSMutableURLRequest *theRequest=[NSMutableURLRequest requestWithURL:tmpURl];

// add http content type - to your request
[theRequest addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

// add  SOAPAction - webMethod that is going to be called
[theRequest addValue:@"http://tempuri.org/GetCategory" forHTTPHeaderField:@"SOAPAction"];

// count your soap message lenght - which is required to be added in your request
NSString *msgLength=[NSString stringWithFormat:@"%i",[soapMessage length]];
// add content length 
[theRequest addValue:msgLength forHTTPHeaderField:@"Content-Length"];

// set method - post
[theRequest setHTTPMethod:@"POST"];

// set http request - body
[theRequest setHTTPBody:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]];

// establish connection with your request & here delegate is self, so you need to implement connection's methods
NSURLConnection *con=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

// if connection is established
if(con)
{
    myWebData=[[NSMutableData data] retain];
    // here -> NSMutableData *myWebData; -> declared in .h file
}
}   

// a method when connection receives response from asp.net web server
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
[myWebData setLength: 0];
}
// when web-service sends data to iPhone
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[myWebData appendData:data];
}
// when there is some error with web service
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
[connection release];
}
// when connection successfully finishes 
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
// check out your web-service retrieved data on log screen
NSString *theXML = [[NSString alloc] initWithBytes: [myWebData mutableBytes] length:[myWebData length] encoding:NSUTF8StringEncoding];
NSLog(@"%@",theXML);
[theXML release];

// if parser isn't nil. here NSXMLParser *myXMLParser; in .h file
if( myXMLParser )
{
    [myXMLParser release];
}

// supply your responded data to xmlParser - xmlParser will parse xmlData & then you can use it
myXMLParser = [[NSXMLParser alloc] initWithData: myWebData];

// here delegate self means implement xmlParse methods
[myXMLParser setDelegate: self];

[myXMLParser setShouldResolveExternalEntities: YES];

// parse method - will invoke xmlParserMethods
[myXMLParser parse];
[connection release];
[myWebData release];
}


//#pragma mark xmlParser
// suppose <myDataTag>myData</endmyDataTag> is the xmlData
// this function will read "<myDataTag>" & tag attributes
-(void)parser:(NSXMLParser*)parser 
                            didStartElement:(NSString*)elementName
                            namespaceURI:(NSString*)namespaceURI
                            qualifiedName:(NSString*)qualifiedName
                            attributes:(NSDictionary*)attributeDict
{
    if([elementName isEqualToString:@"GetCategoryResult"])
    {
        // here categoryArray is NSMutable array declared in .h file.
        // init your array when root element / document element is found
        CategoryArray=[[NSMutableArray alloc]init];
    }
    else if([elementName isEqualToString:@"Prop_Category"])
    {
        aCategory=[[Category alloc] init];
        // if a tag has attribues like <myDataTag id="sagar">
        //aCategory.ID=[attributeDict objectForKey:@"id"];
    }
}

// suppose <myDataTag>myData</endmyDataTag> is the xmlData
// this function will read "myData" & tag attributes
-(void)parser:(NSXMLParser*)parser
                            foundCharacters:(NSString*)string
{
    // here currentElementValue is an NSMutableString declared in .h file
    // store read characters in that mutable string & then add to your object.
    if(!currentElementValue)
    {
        currentElementValue=[[NSMutableString alloc] initWithString:string];
    }
    else
    {
        [currentElementValue appendString:string];
    }
}

// suppose <myDataTag>myData</endmyDataTag> is the xmlData
// this function will read "</endmyDataTag>" & tag attributes
-(void)parser:(NSXMLParser*)parser
            didEndElement:(NSString*)elementName
            namespaceURI:(NSString*)namespaceURI
            qualifiedName:(NSString*)qualifiedName
{
    if([elementName isEqualToString:@"GetCategoryResult"])
    {
        // if end of root element is found- i.e. end of your xml file.
        return;
    }
    else if([elementName isEqualToString:@"Prop_Category"])
    {
        // end of a single data element
        // suppose <category>
        //             <id>10</id>
        //             <name><sagar></name>
        //         </category>
        // when we found </category> we have finished entire category object.
        // here we have an object aCategory -> created custom class "Category"
        // CategoryClass -> NSString *name; NSInteger id;
        // Note: "important"
        //->class variables must be same as tag

        // now after reading entire object add to your mutable array
        // now this mutable array can be used for Table, UIPicker
        [CategoryArray addObject:aCategory];
        [aCategory release];
        aCategory=nil;
        [CategoryTable reloadData];
    }
    else
    {
        // which is equivalent to aCategory.id=10 & aCategory.name=@"sagar"
        [aCategory setValue:currentElementValue forKey:elementName];

        // remove previously read data
        [currentElementValue release];
        currentElementValue=nil;
    }
}
3
ответ дан 1 December 2019 в 20:57
поделиться

Я думаю, что нашел то, что искал, на Веб-сайт VMware .

Инкапсуляция Виртуальная машина - это, по сути, программный контейнер, который объединяет или «инкапсулирует» полный набор виртуальных аппаратных ресурсов, а также операционную систему и все ее приложения внутри программного пакета. Инкапсуляция делает виртуальные машины невероятно портативными и простыми в управлении. Например, вы можете переместить и скопировать виртуальную машину из одного места в другое, как любой другой файл программного обеспечения, или сохранить виртуальную машину на любом стандартном носителе данных, с карманной карты флэш-памяти USB в корпоративные сети хранения данных. (SAN).

Независимость от оборудования Виртуальные машины полностью независимы от своего физического оборудования. Например, вы можете настроить виртуальную машину с виртуальными компонентами (например, ЦП, сетевая карта, контроллер SCSI), которые полностью отличаются от физических компонентов, присутствующих на базовом оборудовании. Виртуальные машины на одном физическом сервере могут даже запускать разные типы операционных систем (Windows, Linux и т. Д.).

В сочетании со свойствами инкапсуляции и совместимости аппаратная независимость дает вам свободу перемещать виртуальную машину из одного типа. компьютера x86 на другой, не внося никаких изменений в драйверы устройств, операционную систему или приложения. Независимость от оборудования также означает, что вы можете запускать разнородную смесь операционных систем и приложений на одном физическом компьютере.

1
ответ дан 1 December 2019 в 20:57
поделиться

Hessian намного лучший протокол связи, чем XML. Будучи двоичным форматом, он еще более компактен, а со строгим синтаксическим анализом формата он намного быстрее.

В качестве бонуса уже есть фреймворки для Java, .NET и PHP для предоставления веб-сервиса. Действительно легко. Предположим, у вас есть этот интерфейс C #:

public interface ITest {
  public string getGreeting();
  int addNumbers(int a, int b);
}

Затем реализовать его на сервере с помощью HessianC # несложно:

public class CTest:CHessianHandler, ITest {
  public string getGreeting() { return "Hello World!"; }
  public int addNumbers(int a, int b) { return a + b; }
  [STAThread]
  private static void Main(string[] args) {
    CWebServer web = new CWebServer(5667, "/test/test.hessian", typeof (CTest));
    web.Paranoid = true;
    web.AcceptClient("[\\d\\s]");
    web.Run();
    for (;; ) {
      if (Console.ReadLine() != "") {
        web.Stop();
        break;
      }
    }
  }
}

На стороне iPhone интерфейс C # необходимо преобразовать в протокол Objective-C:

@protocol ITest
-(NSString*)getGreeting;
-(int)addNumbers:(int)a :(int)b;
@end

А затем использовать HessianKit для получения прокси для службы почти так же просто:

id<ITest> proxy = [CWHessianConnection proxyWithURL:serviceURL
                                           protocol:@protocol(ITest)];
NSLog(@"Greeting: %@", [proxy getGreeting]);
NSLog(@"The answer: %d", [proxy addNumbers:40 :2]);

В этом коротком ответе имена методов не совсем на C #, не совсем на Obj-C или. Это связано с тем, что по умолчанию HessianKit использует соглашения об именах Java. В HessianKit это можно изменить, предоставив переводы имен методов и типов. Так что обе стороны C # и Obj-C в соединении чувствуют себя на 100% как дома. Например:

[CWHessianArchiver setClassName:@"com.mycompany.ITest" 
                    forProtocol:@protocol(CWTest)];
[CWHessianArchiver setMethodName:@"AddNumbers"
                     forSelector:@selector(addInt:toInt:)];
3
ответ дан 1 December 2019 в 20:57
поделиться

Попробуйте wcf buddy, он позволяет легко создать веб-службу SOAP, которую можно вызывать откуда угодно

0
ответ дан 1 December 2019 в 20:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: