2016-06-27 15 views
6

Tôi đã triển khai thành công NSOperationQueue trong ứng dụng.Làm thế nào để tiếp tục thời gian ra hoạt động NSOperationQueue trong iOS?

Tôi có một hàng đợi hoạt động có thể có 1000 NSOperations như dưới đây.

@interface Operations : NSOperation 

@end 

@implementation Operations 

- (void)main 
{ 
    NSURL *url = [NSURL URLWithString:@"Your URL Here"]; 

    NSString *contentType = @"application/json"; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
    [request setHTTPMethod:@"POST"]; 
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 
    NSError *err = nil; 

    NSData *body = [NSJSONSerialization dataWithJSONObject:postVars options:NSJSONWritingPrettyPrinted error:&err]; 

    [request setHTTPBody:body]; 
    [request addValue:[NSString stringWithFormat:@"%lu", (unsigned long)body.length] forHTTPHeaderField: @"Content-Length"]; 

    [request setTimeoutInterval:60]; 

    NSHTTPURLResponse *response = nil; 
    NSError *error = nil; 

    NSData *resData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
} 

@end 

Bây giờ cho hàng đợi đó, tôi sẽ thêm tất cả 1000 hoạt động cùng một lúc. Tôi thêm hoạt động như dưới đây.

Operations *operation = [[Operations alloc]init]; 
[downloadQueue addOperation:operation]; 

Bây giờ những gì xảy ra khoảng thời gian là 60 như [request setTimeoutInterval:60]

Vì vậy, suy nghĩ như sau 60 giây nếu 300 hoạt động ra 1000 hoạt động kết thúc sau đó 700 hoạt động khác được ném thời gian yêu cầu ra lỗi.

Vì vậy, tôi nên làm gì trong trường hợp này.

Tôi có thể tiếp tục các hoạt động không thành công không? Hoặc tôi một lần nữa nên làm cho hoạt động và thêm nó trong hàng đợi.

Có cơ chế nào tốt hơn cơ chế này không?

Trả lời

3

Độ nghiêng ban đầu của tôi là, có, chỉ cần tạo các hoạt động mới cho các yêu cầu đã hết thời gian và đưa chúng trở lại hàng đợi. Nó chỉ cảm thấy đơn giản hơn vì bạn đã có logic để thêm các hoạt động đó cho các yêu cầu của bạn. HOWEVER:

  1. Hãy cẩn thận để không đi vào vòng lặp vô hạn. Nếu chỉ ONE trong số đó không thành công vô thời hạn vì bất kỳ lý do gì, hàng đợi của bạn sẽ tiếp tục chugging. Tôi sẽ giữ một số lượng thất bại để bạn biết ngừng thử lại một yêu cầu sau một số lần thử nghiệm hữu hạn.

  2. Nếu bạn BIẾT rằng một số lượng lớn sẽ luôn thất bại, hãy xem xét sắp xếp chúng theo một cách nào đó. Một lựa chọn sẽ là một chuỗi các phụ thuộc. ví dụ. Bạn có thể thử thêm 200 ops của bạn, NSOperation "wait", 200 tiếp theo, NSOperation "wait" khác, op khác "wait", v.v. Hãy chờ op đầu tiên phụ thuộc vào 200 yêu cầu đầu tiên. Sau đó thực hiện tiếp theo 200 phụ thuộc vào đó chờ đợi op đầu tiên, và vân vân:

    • [đợt 1: 200 yêu cầu đầu tiên]
    • [chờ 1: op mà chờ đợi cho tất cả các đợt 1]
    • [ đợt 2: tiếp theo 200, mỗi đợi chờ 1]
    • [chờ 2: op mà chờ đợi cho tất cả các lô hàng 2]
    • [đợt 3: sau 200, mỗi đợi chờ 2]
    • , vv
  3. Về cơ bản giống như 2 nhưng thay vì một "chờ" op, có một "thực hiện" op.Cho phép nói rằng bạn có một loạt 1000 yêu cầu để gửi: Toss 200 vào hàng đợi, sau đó là "thực hiện" op phụ thuộc vào những 200. Khi "thực hiện" op chạy (theo định nghĩa, SAU những 200 được thực hiện), nó có thể sau đó kéo 200 tiếp theo từ mảng và quăng chúng vào (cộng với một op "thực hiện" mới).

(thậm chí có thể nghĩ tới việc chờ đợi/thực hiện op "tạm dừng" một vài giây để cung cấp cho các máy chủ tạm nghỉ)

Nói cách khác, với # 2 và # 3, tôi đang nói " blast 200 cùng một lúc, chờ đợi, sau đó vụ nổ 200 tiếp theo, chờ đợi, vv " (200 là tùy ý về phía tôi, bạn biết rõ hơn số lượng tốt nhất cho tình huống của bạn)

2

Bạn có thể triển khai phương thức NSURLConnectionDelegateconnection:didFailWithError: để kiểm tra xem yêu cầu đồng bộ có thành công hay không và nếu lỗi đã hết thời gian yêu cầu. Sau đó thử lại kết nối trong cuộc gọi đại biểu.

Tôi nên lưu ý rằng Apple khuyến khích mạnh mẽ việc sử dụng NSURLSession trên NSURLConnection, vì nhiều phương pháp trong NSURLConnection hiện không được chấp nhận.

+0

Bạn có thể vui lòng cung cấp một số tham chiếu mà tôi nên theo dõi không? –

+0

@JayeshSojitra chắc chắn: [NSURLConnectionDelegate documentation] (https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLConnectionDelegate_Protocol/), [NSURLKết nối với Hướng dẫn di chuyển NSURLSession] (https: //www.objc. io/issue/5-ios7/from-nsurlconnection-to-nsurlsession /) – JAL

2

Điểm đầu tiên là - đừng để tất cả chúng chạy cùng một lúc! Bạn có thể dễ dàng tràn ngập kết nối dữ liệu di động nếu bạn cố gắng chạy thậm chí 10 yêu cầu cùng một lúc. Vì vậy, trước khi bất cứ điều gì khác, hãy đặt maxConcurrentOperationCount của hàng đợi thành một cái gì đó như 5.

Điều này một mình sẽ giảm thiểu nghiêm trọng vấn đề của bạn và bạn có thể không cần phải làm gì khác.

Bạn cũng nên thực sự xem xét sử dụng NSURLSession và bằng cách này, bạn cũng có thể xem loại bỏ hàng đợi hoạt động và sử dụng HTTPMaximumConnectionsPerHost để kiểm soát số lượng yêu cầu được thực hiện cùng một lúc.

Nếu bạn vẫn gặp lỗi thì một trong các tùy chọn 'loại đệ quy' khi các câu trả lời khác thảo luận là giải pháp khả thi. Tôi sẽ thêm một số đếm vào lớp con hoạt động để dễ theo dõi và nếu nó không thành công thì kiểm tra xem có bao nhiêu lần thất bại và quyết định có tạo bản sao mới của hoạt động và thêm nó vào hàng đợi hay không .

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