2014-05-07 17 views
12

Tôi đang sử dụng đối tượng NSURLSession để tải hình ảnh trong ứng dụng của mình. Điều đó có thể tải nhiều hình ảnh cùng một lúc.Cách tìm và hủy tác vụ trong NSURLSession?

Trong một số khoảnh khắc, tôi cần hủy tải một hình ảnh cụ thể và tiếp tục tải những hình ảnh khác.

Bạn có thể đề xuất cách chính xác để làm điều đó không?

+0

Vâng, có API 'NSURLSessionTask', tìm những gì bạn muốn hủy và gọi' hủy' trên đó. – esh

+0

Đúng, đó là 'NSURLSesstionTask' và thật dễ dàng để gửi phương thức' hủy'. Nhưng vấn đề là tìm một nhiệm vụ cụ thể. Trong trường hợp này, tôi cần phải liệt kê tất cả các nhiệm vụ của phiên hiện tại và tìm thấy tác vụ mà tôi cần bằng mô tả, ví dụ. Vì vậy, tôi cần một cách để liệt kê các nhiệm vụ trong phiên. –

Trả lời

1

Tôi đề nghị hai phương pháp:

  1. Đặt danh sách các NSURLSessionTask trong một mảng. Trong trường hợp bạn không biết chính xác có bao nhiêu hình ảnh bạn sẽ nhận được. Mặc dù bạn phải biết chỉ số của phiên để hủy bỏ nó.
  2. Nếu bạn nhận được một số lượng hình ảnh giới hạn. Chỉ cần sử dụng một tập hợp các biến toàn cầu NSURLSessionTask để bạn có thể truy cập để hủy nó ở bất cứ nơi nào trong lớp học của bạn.
+1

Cảm ơn câu trả lời của bạn nhưng tôi tin rằng đó là những cách hơi thô lỗ. Cả hai đều sẽ làm việc nhưng cả hai đều có vấn đề thiết kế phần mềm như sử dụng các biến toàn cầu và nhân bản. Có thể sử dụng chúng nếu không tồn tại đúng cách. –

26

Để có được công việc liệt kê, bạn có thể sử dụng phương pháp NSURLSession của

- (void)getTasksWithCompletionHandler:(void (^)(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks))completionHandler; 

không đồng bộ gọi là callback hoàn thành với tất cả các dữ liệu xuất sắc, tải lên, và nhiệm vụ tải về trong một phiên.

Sau đó, chọn task.originalRequest.URL để biết các tác vụ được trả lại để tìm công việc bạn muốn hủy.

+0

Bạn có thể xem mục 'Lấy thông tin tác vụ chung 'trong [this] (https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSessionTask_class/Reference/Reference.html#//apple_ref/doc/uid/TP40013436-CH1-SW14). Và sau đó xác định yêu cầu của bạn thông qua các phương tiện này và hủy bỏ nhiệm vụ trong khối bao gồm trong phương pháp này. – esh

+0

Thật kỳ lạ, trên Xcode 6 và iOS 8 và Swift, tôi nhận được "bộ chọn không nhận dạng" khi tôi gọi invalidateAndCancel() trên đối tượng dataTask. –

+1

@VanDuTran Bạn nên sử dụng phương pháp 'hủy' https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSessionTask_class/index.html#//apple_ref/occ/instm/NSURLSessionTask/cancel – Avt

4

Hy vọng mã trợ giúp dưới đây.

-(IBAction)cancelUpload:(id)sender {  
    if (_uploadTask.state == NSURLSessionTaskStateRunning) { 
     [_uploadTask cancel]; 
    } 
    } 
-1

Tôi nghĩ rằng bạn nên làm điều này ...

Thứ nhất, theo dõi các yêu cầu của bạn mỗi xib

var download_requests = [NSURLSession]() 

Sau đó, bất cứ khi nào bạn thực hiện một yêu cầu, thêm yêu cầu của bạn đến mảng của bạn như vậy,

let s = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration()) 
if let url = NSURL(string: "http://my.url.request.com") 
{ 
    download_requests.append(s) 
    s.dataTaskWithURL(url) 
    { (data, resp, error) -> Void in 
    // .... 
    } 
} 

Sau đó, bất cứ khi nào bạn muốn hủy bất kỳ yêu cầu chưa xử lý nào, hãy nói trên viewDidDis xuất hiện), làm

override func viewDidDisappear(animated: Bool) 
    { 
    super.viewDidDisappear(animated) 
    //stop all download requests 
    for request in download_requests 
    { 
     request.invalidateAndCancel() 
    } 
    } 
+0

Bạn không 't cần phải lưu các phiên, nhìn vào câu trả lời của @ pedrouan – Jimbo

2

Swift 3.0 phiên bản của @ Avt của câu trả lời để có được danh sách công việc. Sử dụng getTasksWithCompletionHandler.

func getTasksWithCompletionHandler(_ completionHandler: @escaping ([URLSessionDataTask], 
    [URLSessionUploadTask], 
    [URLSessionDownloadTask]) -> Void) {  
} 

Các mảng trở lại chứa bất kỳ tác vụ mà bạn đã tạo ra trong phiên , không bao gồm bất kỳ nhiệm vụ đã được chấm dứt hiệu lực sau hoàn thành, thất bại, hoặc bị hủy bỏ.

+0

Tôi đã upvoted này vì vậy hy vọng nó đi lên hàng đầu, vì đây là chính xác là làm điều đó mà không cần giữ một danh sách hướng dẫn sử dụng chính mình. – Jimbo

-1

Bạn chỉ có thể lưu trữ các URL mà bạn đã bắt đầu tải về dataTasks vì vậy khi bạn muốn hủy bỏ một trong những yêu cầu, có URLSessionDataTask tải với đoạn mã sau:

getVideoFromUrl = session.dataTask(with: "Your URL Here") 
getVideoFromUrl?.cancel() 

và hủy URLSessionDataTask như vậy :)

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