سؤال

ولست بحاجة للتحقق ما إذا كان URL (يمثله NSURL) متاح أو بإرجاع 404. ما هو أفضل وسيلة لتحقيق ذلك؟

وأود أن تفضل وسيلة للتحقق من هذا بدون مندوب، إذا أمكن ذلك. ولست بحاجة لمنع تنفيذ البرنامج حتى أعرف إذا كان URL يمكن الوصول إليه أم لا.

هل كانت مفيدة؟

المحلول

وكما تعلمون بالفعل أن خطأ عام يمكن التقاط بطريقة didFailWithError:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"Connection failed! Error - %@ %@",
          [error localizedDescription],
          [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
}

ولكن مقابل 404 "غير موجود" أو 500 "خطأ خادم داخلي" ينبغي قادرة على التقاط داخل طريقة didReceiveResponse:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    if ([response respondsToSelector:@selector(statusCode)])
    {
        int statusCode = [((NSHTTPURLResponse *)response) statusCode];
        if (statusCode == 404)
        {
            [connection cancel];  // stop connecting; no more delegate messages
            NSLog(@"didReceiveResponse statusCode with %i", statusCode);
        }
    }
}

نصائح أخرى

وأنا في حاجة إلى حل لا تستخدم مندوب سواء، لذلك أخذت قطعة من الكود الظاهر في إجابات أخرى هنا، وخلق أسلوب بسيط هو أن يعمل بشكل جيد في حالتي (وربما ما كنت تبحث عن وكذلك) :

    -(BOOL) webFileExists {

        NSString *url = @"http://www.apple.com/somefile.html";

        NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0];
        NSHTTPURLResponse* response = nil;
        NSError* error = nil;
        [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
        NSLog(@"statusCode = %d", [response statusCode]);

        if ([response statusCode] == 404)
            return NO;
        else
            return YES;
     }

ولقد استخدمت الجواب من woodmantech أعلاه، ولكن تغييره بناء على ما شاهدته على أسئلة أخرى مماثلة هنا بحيث لا يتم تحميل الملف بأكمله لمعرفة ما إذا كان موجودا.

ولقد غيرت NSURLRequest إلى NSMutableURLRequest، وأضاف:

[request setHTTPMethod:@"HEAD"];

ويبدو أن هذا العمل غرامة. أنا أعمل على أول تطبيق بلدي، لذلك لا تجربة حقيقية حتى الان. شكرا للجميع.

 NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0];
    [request setHTTPMethod:@"HEAD"];
    NSHTTPURLResponse* response = nil;
    NSError* error = nil;
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    NSLog(@"statusCode = %d", [response statusCode]);

ويمكنك تحقيق اتصال متزامن من خلال الدعوة:

NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSHTTPURLResponse* response = nil;
NSError* error = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

وسوف موضوع لديك كتلة حتى beeen تقديم الطلب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top