2012-02-15 38 views
7

Đầu tiên của tất cả các câu hỏi là thất bại simiple .. nếu bạn chỉ muốn xem những gì họ đang bỏ qua để dưới cùng của bài đăng này và bạn sẽ thấy chúng in đậm .. để biết thêm chi tiết sau đó bạn có thể đọc phần còn lại của bài đăng này ...nsurlconnection yêu cầu không đồng bộ

Tôi chỉ đang cố gắng loại bỏ NSURLConnection của mình để hoạt động trơn tru và tôi hiểu điều này đúng cách. Có một sự thiếu sót sâu sắc về các ví dụ/hướng dẫn cho các kết nối không đồng bộ trên internet hoặc không có bất kỳ thứ gì tôi có thể tìm thấy. Hy vọng rằng câu hỏi này có thể lấp đầy khoảng trống mà tôi cảm thấy là ở đó cho những người dùng khác.

Vì vậy, trong tệp .h tôi đã nhập các tiêu đề nền móng và khai báo các phương thức cần thiết cho dữ liệu nhận được hoặc thiếu dữ liệu nhận được (lỗi, v.v.).

.h

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> //add foundations 
//.. other headers can be imported here 

@interface MyViewController: UITableViewController { 

//Im not setting any delegates to access the methods because Is all happening in the same 
//place so I just use the key word 'self' when accessing the methods declared below 
//I'm not sure if this is the best thing to do but I wasn't able to get my head around declaring the delegate or how it would help me with the way I have set up my request etc. 

} 
- (IBAction)setRequestString:(NSString *)string; //this method sets the request and connection methods 

//these methods receive the response from my async nsurlconnection 
- (void)receivedData:(NSData *)data; 
- (void)emptyReply; 
- (void)timedOut; 
- (void)downloadError:(NSError *)error; 

So thats tập tin tiêu đề của tôi .. khá đơn giản không có nhiều giải thích cần thiết.

.m

//call setRequestString from some other method attached to a button click or something 
[self setRequestString:@"rss.xml"]; 
//.. 

- (IBAction)setRequestString:(NSString *)string 
{ 
    //Set database address 
    NSMutableString *databaseURL = [[NSMutableString alloc] initWithString:@"http:www.comicbookresources/feeds/"]; // address not real jsut example 

    //append the string coming in to the end of the databaseURL 
    [databaseURL appendString:string]; 

    //prepare NSURL with newly created string 
    NSURL *url = [NSURL URLWithString:databaseURL]; 

    //AsynchronousRequest to grab the data 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 

    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 
    { 
     if ([data length] > 0 && error == nil){ 
      [self receivedData:data]; 
     }else if ([data length] == 0 && error == nil){ 
      [self emptyReply]; 
     }else if (error != nil && error.code == NSURLErrorTimedOut){ //used this NSURLErrorTimedOut from foundation error responses 
      [self timedOut]; 
     }else if (error != nil){ 
      [self downloadError:error]; 
     } 
    }]; 
} 

tại thiết lập các phương pháp đã được khởi tạo trong file .h và gọi trong câu lệnh if trên

- (void)receivedData:(NSData *)data 
{ 
    NSString* newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSLog(@"%@", newStr); //logs recived data 
    //now you can see what data is coming in on your log 
    //do what you want with your data here (i.e. start parsing methods 
} 
- (void)emptyReply 
{ 
    //not sure what to do here yet? 
} 
- (void)timedOut 
{ 
    //also not sure what to do here yet? 
} 
- (void)downloadError:(NSError *)error 
{ 
    NSLog(@"%@", error); 
    UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Error!" message:@"A connection failure occurred." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
    [errorAlert show]; 
} 

mát để khá nhiều những điều cơ bản của những gì tôi đã làm ngay tại đó .. bây giờ những câu hỏi tôi có được như sau.

Câu hỏi một: Nơi tôi gọi NSURLConnection như vậy

[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 
     { 

gì đang xảy ra ở đây là những gì mà^cho là thực hiện rằng toàn bộ khối (kể cả nếu báo cáo) trên một chủ đề khác nhau hoặc một cái gì đó ? bởi vì nó trông rất giống như định dạng công văn lớn nhưng hơi khác một chút.

Câu hỏi hai: những gì tôi nên làm bên emptyReply & hết thời gian chờ phương pháp?

Câu hỏi ba: Làm cách nào để kết hợp bộ đệm ẩn vào trong bộ nhớ cache này? Tôi muốn lưu lại các câu trả lời mà tôi nhận được từ các yêu cầu khác nhau. tức là với setRequestString của tôi, bạn sẽ thấy có một tham số đầu vào chuỗi, vì vậy tôi có thể yêu cầu nguồn cấp dữ liệu rss khác nhau với cùng một phương thức .. Tôi cần tìm ra cách để lưu trữ các phản hồi này vào bộ đệm riêng lẻ .. nhưng không chắc bắt đầu từ đâu nó.

Cuối cùng Nếu bạn đã thực hiện điều này đến nay, cảm ơn bạn rất nhiều vì đã đọc câu hỏi của tôi. Hy vọng rằng với câu trả lời của bạn, chúng tôi có thể nhận được một giải pháp khá tốt đẹp ở đây .. mà những người khác có thể sử dụng cho chính mình và chọn và chọn các bit và peices họ cần mà làm việc cho giải pháp riêng ..

Dù sao cảm ơn bạn rất nhiều vì đọc và tôi mong các câu trả lời của bạn ..ngay cả khi chúng chỉ là những điều chỉnh cho các hướng dẫn hoặc các ví dụ bạn nghĩ có thể giúp tôi .. bất cứ điều gì là tốt, tôi chỉ muốn hiểu đầy đủ những gì đang xảy ra và đó là một giải pháp tốt.

Trả lời

5
  1. Đọc về các khối trong tài liệu của Apple. Mới của nó. Hoặc bạn có thể đọc here
  2. Bạn có thể hiển thị các lỗi như yêu cầu hết thời gian vv Bạn không thực sự phải xử lý chúng riêng biệt với lỗi trừ khi bạn có logic đặc biệt.
  3. Hãy thử điều này cho bộ nhớ đệm

    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:TIMEOUT_INTERVAL]; 
    
+0

cảm ơn cho câu trả lời. Cool sẽ đọc về các khối arvo này. Liên quan đến ví dụ bộ nhớ cache của bạn .. Tôi không muốn bộ nhớ cache phản ứng .. tôi muốn cache các câu trả lời .. Tuy nhiên tôi không chắc chắn làm thế nào để xử lý chúng .. nếu tôi cần một phương pháp cho điều này .. hoặc làm tôi đặt nsurlconnection của tôi vào một tuyên bố if và sử dụng các chính sách cahce khác nhau được tìm thấy ở đây https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSURLRequest_Class/Reference/Reference.html một lần nữa cảm ơn câu trả lời .. Im sẽ đi làm một số nghiên cứu về các khối ngay bây giờ .. –

+0

câu trả lời rất tốt –

Các vấn đề liên quan