Sử dụng NSURLProtocol với Swift

1.Bắt đầu

Đối với bài viết này, bạn sẽ tạo một trình duyệt web di động cơ bản, chẳng hạn như trình duyệt web bạn có thể thêm vào ứng dụng tiếp theo của mình. Nó sẽ có một giao diện người dùng cơ bản cho phép người dùng nhập và vào một URL. Trình duyệt của bạn sẽ lưu vào bộ nhớ cache thành công được truy xuất kết quả. Bằng cách này, người dùng có thể tải các trang đã được truy cập trong nháy mắt vì trang sẽ không tải từ yêu cầu mạng mà từ bộ nhớ cache cục bộ của ứng dụng.
Bạn đã biết rằng trang tải nhanh thì người dùng sẽ rất hài lòng, vì vậy đây là ví dụ tốt về cách NSURLProtocol có thể cải thiện hiệu suất của ứng dụng của bạn.
Sau đây là các bước bạn cần làm:
Sử dung UIWebView để hiện thị trang web
Sử dụng CoreData để lưu bộ nhớ cache

Tổng quan dự án

Bạn có thể tải Project tại đây, sau đó giải nén nó và bắt đầu 😃))

2.Chặn các yêu cầu mạng

Một tập hợp các lớp được gọi là URL Loading System xử lý các yêu cầu URL trên iOS. Đối với yêu cầu mạng, lớp này cho biết máy chủ của bạn đang cố gắng tiếp cận ứng dụng nào và đường dẫn đến tài nguyên tại máy chủ lưu trữ đó. Ngoài ra, đối tượng NSURLRequest còn thêm thông tin như tiêu đề HTTP, body, v.v.
Bây giờ là lúc để bắt đầu chặn tất cả các ứng dụng của NSURLRequest được kích hoạt.Để làm được điều đó, bạn sẽ triển khai NSURLProtocol của riêng mình.
Mỗi khi URL Loading System nhận được yêu cầu load 1 URL, nó sẽ tìm kiếm trình xử lý giao thức đã đăng ký để xử lý yêu cầu. Mỗi trình xử lý cho hệ thống biết liệu nó có thể xử lý một yêu cầu đã cho thông qua phương thức canInitWithRequest ( 😃 của nó hay không?
Tham số cho phương thức này là yêu cầu giao thức được hỏi nếu nó có thể xử lý. Nếu phương thức trả về true, thì hệ thống tải sẽ dựa vào lớp con NSURLProtocol này để xử lý yêu cầu và bỏ qua tất cả các trình xử lý khác.
Mở AppDelegate.swift và thay thế phương thức (: didFinishLaunchingWithOptions 😃 bằng phương thức này:
Bây giờ khi chạy ứng dụng, nó sẽ đăng kí protocol với URL Loading system. Điều đó có nghĩa là nó sẽ có cơ hội xử lý mọi yêu cầu được gửi đến hệ thống tải URL.
Trong console, bạn sẽ thấy một cái gì đó như thế này:

3.Tùy chỉnh URL Loading

Nếu bạn đang triển khai giao thức mạng ứng dụng mới từ đầu (ví dụ: thêm giao thức foo: //), thì đây là nơi bạn nắm lấy những niềm vui khắc nghiệt của việc triển khai giao thức mạng ứng dụng. Nhưng vì mục tiêu của bạn chỉ là chèn một lớp bộ nhớ đệm tùy chỉnh, bạn có thể lấy dữ liệu bằng cách sử dụng NSURLConnection.
Hiệu quả là bạn chỉ cần đánh chặn yêu cầu và sau đó chuyển nó trở lại URL Loading System tiêu chuẩn thông qua việc sử dụng NSURLConnection.
Custom class NSURLProtocol của bạn trả về dữ liệu thông qua một đối tượng thực hiện giao thức NSURLProtocolClient. Có một chút nhầm lẫn đặt tên để giữ thẳng trong đầu của bạn: NSURLProtocol là một lớp, và NSURLProtocolClient là một protocol
Mở MyURLProtocol.swift và thêm thuộc tính sau vào đầu định nghĩa lớp MyURLProtocol
Tiếp theo, tìm canInitWithRequest ( 😃. Thay đổi dòng trả về thành true:
và thêm một số phương thức:

4.Triển khai Local Cache

Hãy nhớ yêu cầu cơ bản cho ứng dụng này: đối với một yêu cầu nhất định, nó sẽ tải dữ liệu từ web chỉ một lần và sau đó lưu trữ dữ liệu đó. Nếu yêu cầu tương tự được kích hoạt lại trong tương lai, giao thức của bạn sẽ phân phối phản hồi được lưu trong bộ nhớ cache mà không cần tải lại từ web.
Đã đến lúc lưu các câu trả lời mà ứng dụng của bạn nhận được từ web và truy xuất chúng bất cứ khi nào nó có dữ liệu được lưu trong bộ nhớ cache phù hợp. Mở MyURLProtocol.swift và thêm mục nhập sau vào đầu tệp:
và thêm 2 thuộc tính sau:
Thuôc tính response sẽ giữ tham chiếu tới data mà bạn cần khi lưu response từ server.Thuộc tính mutableData sẽ được sử dụng để giữ dữ liệu mà kết nối nhận được trong phương thức kết nối (: didReceiveData 😃 delegate. Bất cứ khi nào kết nối kết thúc, bạn có thể cache phản hồi (dữ liệu và siêu dữ liệu). Hàm trên đã thực hiện được các bước để lưu trữ dữ liệu vào trong Core Data
Bây giờ bạn có một cách để lưu trữ dữ liệu, bạn cần phải gọi phương thức này từ đâu đó. Vẫn còn trong MyURLProtocol.swift, thay đổi phương thức ủy nhiệm NSURLConnection thành các triển khai sau:
Thay vì trực tiếp bàn giao cho client, phản hồi và dữ liệu được lưu trữ bởi lớp giao thức tùy chỉnh của bạn ngay bây giờ.

5.Truy xuất phản hồi được lưu trong bộ nhớ cache

Cuối cùng, bây giờ là lúc để truy xuất các phản hồi được lưu trong bộ nhớ cache và gửi chúng đến máy khách của NSURLProtocol. Mở MyURLProtocol.swift. Sau đó, thêm phương thức sau:
Bây giờ là lúc nhìn lại triển khai startLoading (). Thay vì chỉ tải mọi thứ từ web, nó cần phải kiểm tra phản hồi được lưu trong bộ nhớ cache cho URL đầu tiên. Tìm triển khai hiện tại và thay thế bằng các thao tác sau:

6.Tổng kết

Ví dụ này đề cập đến việc sử dụng NSURLProtocol đơn giản, nhưng đừng nhầm lẫn nó như một giải pháp hoàn chỉnh cho bộ nhớ đệm. Có rất nhiều thứ khác để triển khai trình duyệt bộ nhớ đệm. Trong thực tế, Loading systems có cấu hình bộ nhớ đệm tích hợp, đáng để tìm hiểu. Mục tiêu của hướng dẫn này chỉ đơn giản là để cho bạn thấy các khả năng. Bởi vì NSURLProtocol có quyền truy cập vào dữ liệu vào và ra khỏi rất nhiều thành phần, nó rất mạnh mẽ! Hầu như không có giới hạn cho những gì bạn có thể thực hiện phương thức -startLoading. Tài liệu tham khảo: https://www.raywenderlich.com/76735/using-nsurlprotocol-swift