İphone'da birden fazla delege nasıl kullanılır?

Ben json kullanmak için aşağıdaki kodu kullanıyorum ama aynı sayfada daha fazla url bağlantısına ihtiyacım var, nasıl başaracağım, şimdiden teşekkürler

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
[responseData setLength:0];
}

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

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
NSLog([NSString stringWithFormat:@"Connection failed: %@", [error description]]);
 }

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[connection release];
//do something with the json that comes back ... (the fun part)
}

- (void)viewDidLoad
{
[self searchForStuff:@"iPhone"];

}

-(void)searchForStuff:(NSString *)text
 {
responseData = [[NSMutableData data] retain];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL   URLWithString:@"http://www.whatever.com/json"]];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
}

Web erişimi için PHP kullanıyorum

0

4 cevap

İşaretçiyi bağlantılara tutmak için örnek değişkenlerini kullanabilirsiniz. Sonra delege geri aramalarında, hangi bağlantıyı ele aldığınızı kontrol etmek için işaretçi eşitliğini kontrol edin.

2
katma
Öncelikle bazı basit şeyler inşa etmenizi, Objective C'nin asılmasını sağlamanızı, belki de bazı eğiticilerinizi takip etmenizi ve daha sonra kendiniz denemenizi tavsiye edebilirim;). Ya da sadece Dan Rays mükemmel çözümünü kullanın.
katma yazar Rengers, kaynak
Ben objektif C'de daha yeniyim, bu yüzden bana kodu ver
katma yazar sabeer mohamed, kaynak

NSValue, NSCopying ile uyumlu olduğundan işaretçiyi bağlantıya sarmak için kullanıyorum ve bunu NSMutableDictionary 'dan ilgili verilere erişmek için anahtar olarak kullanıyorum. Örneğin, aşağıdaki gibi bir şey yapabilirsiniz:

-(void)searchForStuff:(NSString *)text withTarget:(id)target selector:(SEL)selector {
    responseData = [[NSMutableData data] retain];
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.whatever.com/json"]];
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:target,@"target",NSStringFromSelector(selector),@"selector",nil];
    NSURLConnection *c = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    [myMutableDictionary setObject:options forKey:[NSValue valueWithPointer:c]];
    [c release];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSValue *p = [NSValue valueWithPointer:connection];
    NSDictionary *options = [myMutableDictionary objectForKey:p];
    if (options) {
        id target = [options objectForKey:@"target"];
        SEL selector = NSSelectorFromString([options objectForKey:@"selector"]);
        if (target && selector && [target respondsToSelector:selector]) {
            [target performSelector:selector withObject:responseData];
        }
    }
}
1
katma

Bunlardan hiçbirini yapma.

Bunun yerine, her şeyi daha basit ve daha iyi hale getiren mükemmel ASIHTTPRequest kütüphanesini kullanın. Tam olarak, birkaç yıl önce ASI'yi keşfettiğimden beri, tek bir NSURLConnection yazmamıştım.

ASI'nin blok arabirimi, bir istek nesnesini ateşlemeden önce işleyici koduyla yapılandırmanıza izin verir ve herhangi bir yetkilendirme ihtiyacını ortadan kaldırır.

__block ASIHTTPRequest *r = [ASIHTTPRequest requestWithUrl:myNSURLObject];
[r setCompletionBlock:^{
    NSLog([r responseString]); //for instance
}];
[r startAsynchronous];

Bloklar sizi korkutursa, belirli bir yöntemi belirli bir yöntemle de işaretleyebilirsiniz, böylece farklı istek türleri ayrı ayrı ele alınabilir:

- (void) viewDidLoad { //or wherever
    ASIHTTPRequest *r = [ASIHTTPRequest requestWithUrl:myFirstURL];
    r.delegate = self;
    [r setDidFinishSelector:@selector(requestDone:)];
    [r startAsynchronous];
}

// then later on...
- (void)requestDone:(ASIHTTPRequest *)request
{
   NSString *response = [request responseString];
}
0
katma
@codecaffeine - Wow .... Hiçbir fikrim yoktu. Tanrım, bir aile üyesinin öldüğünü ya da bir şey gibi hissediyorum. Whew. Değişim için etrafa bakmaya başlamalıyım sanırım. Hiçbir şekilde doğal acıya geri dönmeyeceğim.
katma yazar Dan Ray, kaynak
Blok tabanlı yaklaşımdan hoşlanırken (ve NSURLConnection onu kullanıyordu) ASIHTTPRequest'i kullanmaktan kaçınıyorum çünkü artık geliştirici tarafından desteklenmiyor. Hala desteklenmekte olan benzer kitaplıklar var. Daha fazla bilgi için ASIHTTPRequest'in bloguna bakın allseeing-i.com
katma yazar codecaffeine, kaynak
Evet, blok tabanlı URL yüklemesi daha mantıklı ve daha kolay olduğunu düşünüyorum. Umarım Apple NSURLConnection'a benzer bir şey ekler. allseeing-i.com blogu birkaç alternatiften bahseder.
katma yazar codecaffeine, kaynak

Aslında birden fazla delege ihtiyacın yok. Birden fazla NSURLConnection'a ihtiyacınız var ve temsilci yöntemini çağırmak için test edebilirsiniz.

Örneğin. Aşağıdaki örnek değişkeni (veya özellikleri) varsayarsak:

NSURLConnection *connectionA;
NSURLConnection *connectionB;
NSMutableData *dataA;
NSMutalbeData *dataB;

Önce her bir NSURLConnection değişkenini başlatırsınız

-(void)searchA:(NSString *)text
{
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.a.com/%@", text]]];
    connectionA = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

-(void)searchB:(NSString *)text
{
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.b.com/%@", text]]];
    connectionB = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

Ardından, temsilci yöntemini hangi bağlantıyı aradığını ve bağlantıya göre uygulamayı özelleştireceğini test edebilirsiniz.

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    if (connection == connectionA) {
        [dataA appendData:data];
    }
    else if (connection == connectionB) {
        [dataB appendData:data];
    }
}

Her delege yöntemi için bunu yapmanız gerekir.

0
katma
Tüm temsilci yöntemlerini bağlantıya benzer şekilde yazabilirsiniz: didReceiveData :. Her bağlantıya göre davranışı özelleştirmek için "if… else" ifadesini kullanın.
katma yazar codecaffeine, kaynak
çalışıyor ama connectionDidFinishLoading nasıl kullanılır
katma yazar sabeer mohamed, kaynak