Soru & Cevap

NSURLConnection bağlantısı

06.11.2013 - 12:46

Merhaba,

Web Service bağlantısı gerçekleştirirken [Connection start] dedikten sonra, web service metodum her nereden çağrılırsa çağrılsın direk olarak;

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

{}

metoduna bağlansın istiyorum. Ancak başka bir metod içinden çağırdığım web service bağlantı fonksiyonu işlendikten sonra, connection open olmasına rağmen ilk olarak web service metodunu çağırdığım fonksiyona dönüp fonksiyonu işliyor ve ardından "didReceiveResponse" metoduna giriş yapıp web service verisini döndürüyor. 

Bunu farklı olarak connection start dendiği anda "didReceiveResponse" girmesini sağlayacak bir düzenleme yapabilir miyim?

18 Görüntülenme

7 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-41882-1428576465.jpg
HarunBAHÇEL
08.06.2015 - 02:12

Hocam çok mantıklı çalışma ama ben butonun altında textfield içeriğini alıp ona gore webservis çalıştırıyorum. bunu nasıl yapacağım.

Profile picture for user burak_benli
burak_benli
06.11.2013 - 02:23

Yardımınız için teşekkürler, iyi çalışmalar dilerim.

picture-707-1383654821.jpg
cemturker
06.11.2013 - 02:19

Sorununuzu simdi anladim. didReceiveResponse yapisinda size direkt olarak call yaptiginiz sayfanin verisi donmez. İlk asamada, baglanti kuruldugunda gelen cevap yeterli ise bu metoda dusersiniz. Sizin datanin tamamini karsilamaniz gereken yer ise didReceiveData  delegate metodu olmali. Ayrintili bilgi icin; https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLConnectionDataDelegate_protocol/Reference/Reference.html

block kullanimini ise network isleri gibi zaman alabilecek islerin background thread uzerinde yapilmasi acisindan oneriyorum. Yukarida verdigim kod ornegini kendi kodunuza gore uyarlayarak istediginiz sonucu elde edebilirsiniz. 

Kolay gelsin.

Profile picture for user burak_benli
burak_benli
06.11.2013 - 02:03

@Cem,

Kusura bakmayın, bu yapıyı bilmediğim için söylediklerinizi tam olarak kavrayamadım. Kodu göndereyim o zaman sıkıntımı daha net aktarabilirim sanırım;

-(void)WebServiceBaglantim

 NSString *soapMessage =  [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>" "<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/\">"

                              "<soap:Body>"

                              "<LokasyonMusaitmi xmlns=\"http://tempuri.org/\">"

                              "<SirketID>%@</SirketID>"

                              "<YerID>%@</YerID>"

                              "<GunNo>%@</GunNo>"

                              "<AlisTarihi>%@</AlisTarihi>"

                              "<BirakisTarihi>%@</BirakisTarihi>"

                              "</LokasyonMusaitmi>"

                              "</soap:Body>"

                              "</soap:Envelope>",SirketID,YerID,GunNo,AlisTarihi,BirakisTarihi];

    

    NSURL *url =[NSURL URLWithString:@"http://deneme.com"];

    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];

    NSString *msgLength = [NSString stringWithFormat:@"%d",[soapMessage length]];

    

    

    [theRequest addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

    [theRequest addValue:@"http://tempuri.org/LokasyonMusaitmi" forHTTPHeaderField:@"SOAPAction"];

    [theRequest addValue:msgLength forHTTPHeaderField:@"Content-Length"];

    [theRequest setHTTPMethod:@"POST"];

    [theRequest setHTTPBody:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]];

    theConnectionLokasyonKontrol = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

     if(theConnectionLokasyonKontrol){

 webDataLokasyonKontrol =[NSMutableData data];

}

Bu fonksiyon işlendikten hemen sonra bağlantı açılıyor, ancak 

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

{

  NSLog(@"Bağlantı Var");

    if(theConnectionLokasyonKontrol)

        [webDataLokasyonKontrol setLength:0];

    }

Bu yapıya direk girmiyor, 'WebServiceBaglantim'  fonksiyonunu çağırdığım yere tekrar dönüyor ve veriye daha sonra erişiyorum. bunu dispatch_async  ile yaptığımızda yani sizin gönderdiğiniz yapıyla düzenlediğimizde sorun hallolur mu? 

picture-707-1383654821.jpg
cemturker
06.11.2013 - 01:45

Ayrica delegate metoduna response dusmesini beklemenize gerek yok. 

URLRequest nesnenizi olusturduktan sonra;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
ile data degiskenine baglantidan gelen degiskeni direkt olarak alabilirsiniz. Bu metodu background block uzerinde cagirirsaniz, cevap dondugunde icerideki blockta ilgili dataya erisebilirsiniz. Toplamda kabaca soyle bir kod isinizi gorecektir;

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

        NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"url"]];

        NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

        

        dispatch_async(dispatch_get_main_queue(), ^{

            NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

            NSLog(@"%@", str);

            

        });

        

    });

 

Ancak bu block altina bir kod yazarsaniz connection nesnesi background thread uzerinde yurudugu icin o kod calistirilmaya devam edecektir. Yazilim mantiginizi kurarken cevabin donusunden sonra cagiralacak metodlari icteki block icerisinde cagirmaya calisin.

picture-707-1383654821.jpg
cemturker
06.11.2013 - 01:29

Bunun icin dispatch_async block yapilarini kullanmaniz mantikli olur. Boylece network connection metodunuzu background thread uzerinde cagirip, cevabi main thread uzerinde karsilayabilirsiniz. Ornegin;

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
          //burada web service call islemini yapin. backgroundda calisacaktir

           dispatch_async(dispatch_get_main_queue(), ^{
           // burasi ise ustteki block isini bitirdiginde cagiralacak olan block. main thread uzerinde calisir.

           });

});

 

blocklar hakkinda daha ayrintili bilgi edinmek isterseniz, Apple developer sayfasindan WWDC 2012 videolarindan Asynchronous Design Patterns with Blocks, GCD, and XPC videosunu izlemenizi tavsiye ederim.

picture-399-1379511904.jpg
halil
06.11.2013 - 01:17

flagleme ile fonksiyonun çalıştırılmasını denedin mi?