Triển khai hàng đợi trong javascript
Mô-đun gốc và Thành phần gốc là các công nghệ ổn định của chúng tôi được sử dụng bởi kiến trúc cũ. Chúng sẽ không còn được dùng nữa trong tương lai khi Kiến trúc mới ổn định. Kiến trúc mới sử dụng Mô-đun gốc Turbo và Cấu phần gốc vải để đạt được kết quả tương tự Show
Chào mừng bạn đến với Mô-đun bản địa dành cho iOS. Vui lòng bắt đầu bằng cách đọc Phần giới thiệu mô-đun gốc để biết phần giới thiệu về mô-đun gốc là gì Tạo một mô-đun gốc lịchTrong hướng dẫn sau đây, bạn sẽ tạo một mô-đun gốc, 7, mô-đun này sẽ cho phép bạn truy cập các API lịch của Apple từ JavaScript. Cuối cùng, bạn sẽ có thể gọi 8 từ JavaScript, gọi một phương thức gốc để tạo sự kiện lịchCài đặtĐể bắt đầu, hãy mở dự án iOS trong ứng dụng React Native của bạn trong Xcode. Bạn có thể tìm thấy dự án iOS của mình tại đây trong ứng dụng React Native Chúng tôi khuyên bạn nên sử dụng Xcode để viết mã gốc của mình. Xcode được xây dựng để phát triển iOS và việc sử dụng nó sẽ giúp bạn nhanh chóng giải quyết các lỗi nhỏ hơn như cú pháp mã Tạo tệp mô-đun gốc tùy chỉnhBước đầu tiên là tạo các tệp triển khai và tiêu đề mô-đun gốc tùy chỉnh chính của chúng tôi. Tạo một tệp mới có tên là 9và thêm phần sau vào nó
Bạn có thể sử dụng bất kỳ tên nào phù hợp với mô-đun gốc mà bạn đang xây dựng. Đặt tên cho lớp là 0 vì bạn đang tạo mô-đun gốc lịch. Vì ObjC không hỗ trợ cấp độ ngôn ngữ cho các không gian tên như Java hoặc C++, nên quy ước là thêm vào trước tên lớp một chuỗi con. Đây có thể là tên viết tắt của tên ứng dụng hoặc tên cơ sở hạ tầng của bạn. RCT, trong ví dụ này, đề cập đến ReactNhư bạn có thể thấy bên dưới, lớp CalendarModule triển khai giao thức 1. Mô-đun gốc là một lớp Objective-C triển khai giao thức 1Tiếp theo, hãy bắt đầu triển khai mô-đun gốc. Tạo tệp triển khai tương ứng, 3, trong cùng một thư mục và bao gồm nội dung sau________số 8_______ Tên mô-đunHiện tại, mô-đun gốc 3 của bạn chỉ bao gồm macro 5, macro này sẽ xuất và đăng ký lớp mô-đun gốc với React Native. Macro 5 cũng có một đối số tùy chọn chỉ định tên mà mô-đun sẽ có thể truy cập được như trong mã JavaScript của bạnĐối số này không phải là một chuỗi ký tự. Trong ví dụ dưới đây, 7 được thông qua, không phải 8
Sau đó, mô-đun gốc có thể được truy cập trong JS như thế này
Nếu bạn không chỉ định tên, tên mô-đun JavaScript sẽ khớp với tên lớp Objective-C, với mọi tiền tố "RCT" hoặc "RK" bị xóa Hãy làm theo ví dụ dưới đây và gọi 5 mà không có bất kỳ đối số nào. Do đó, mô-đun sẽ được tiếp xúc với React Native bằng cách sử dụng tên 7, vì đó là tên lớp Objective-C, đã loại bỏ RCT
Sau đó, mô-đun gốc có thể được truy cập trong JS như thế này
Xuất phương thức gốc sang JavaScriptReact Native sẽ không hiển thị bất kỳ phương thức nào trong mô-đun gốc cho JavaScript trừ khi được thông báo rõ ràng với. Điều này có thể được thực hiện bằng cách sử dụng macro 1. Các phương thức được viết trong macro 1 là không đồng bộ và do đó, kiểu trả về luôn bị vô hiệu. Để chuyển kết quả từ phương thức 1 sang JavaScript, bạn có thể sử dụng lệnh gọi lại hoặc phát ra sự kiện (được trình bày bên dưới). Hãy tiếp tục và thiết lập một phương thức gốc cho mô-đun gốc 7 của chúng ta bằng cách sử dụng macro 1. Gọi nó là 6 và bây giờ nó nhận các đối số tên và vị trí dưới dạng chuỗi. Các tùy chọn loại đối số sẽ được đề cập ngay sau đây
Trước khi bạn xây dựng chức năng của phương thức 6, hãy thêm nhật ký bảng điều khiển vào phương thức để bạn có thể xác nhận rằng nó đã được gọi từ JavaScript trong ứng dụng React Native của bạn. Sử dụng các API 1 từ React. Hãy nhập tiêu đề đó ở đầu tệp của bạn rồi thêm lệnh gọi nhật ký
Phương thức đồng bộBạn có thể sử dụng 2 để tạo phương thức gốc đồng bộ
Có thể bạn quan tâmKiểu trả về của phương thức này phải thuộc kiểu đối tượng (id) và phải được tuần tự hóa thành JSON. Điều này có nghĩa là hook chỉ có thể trả về các giá trị nil hoặc JSON (e. g. NSNumber, NSString, NSArray, NSDictionary) Hiện tại, chúng tôi không khuyên bạn nên sử dụng các phương thức đồng bộ, vì việc gọi các phương thức đồng bộ có thể có các hình phạt hiệu suất mạnh và gây ra các lỗi liên quan đến luồng cho các mô-đun gốc của bạn. Ngoài ra, xin lưu ý rằng nếu bạn chọn sử dụng 2, ứng dụng của bạn không thể sử dụng trình gỡ lỗi của Google Chrome nữa. Điều này là do các phương thức đồng bộ yêu cầu máy ảo JS chia sẻ bộ nhớ với ứng dụng. Đối với trình gỡ lỗi Google Chrome, React Native chạy bên trong JS VM trong Google Chrome và giao tiếp không đồng bộ với thiết bị di động qua WebSocketsKiểm tra những gì bạn đã xây dựngTại thời điểm này, bạn đã thiết lập giàn giáo cơ bản cho mô-đun gốc của mình trong iOS. Kiểm tra điều đó bằng cách truy cập mô-đun gốc và gọi phương thức đã xuất của nó trong JavaScript Tìm một vị trí trong ứng dụng của bạn mà bạn muốn thêm lệnh gọi vào phương thức 6 của mô-đun gốc. Dưới đây là ví dụ về thành phần, 5 bạn có thể thêm vào ứng dụng của mình. Bạn có thể gọi mô-đun gốc bên trong hàm 7 của 5
Để truy cập mô-đun gốc của bạn từ JavaScript, trước tiên bạn cần nhập 8 từ React Native 0Sau đó, bạn có thể truy cập mô-đun gốc 7 của 8 1Bây giờ bạn đã có sẵn mô-đun gốc CalendarModule, bạn có thể gọi phương thức gốc của mình 6. Bên dưới nó được thêm vào phương thức 7 trong 5 2Bước cuối cùng là xây dựng lại ứng dụng React Native để bạn có thể có mã gốc mới nhất (với mô-đun gốc mới của bạn. ) có sẵn. Trong dòng lệnh của bạn, nơi đặt ứng dụng gốc phản ứng, hãy chạy như sau 3Xây dựng khi bạn lặp lạiKhi bạn làm việc thông qua các hướng dẫn này và lặp lại trên mô-đun gốc của mình, bạn sẽ cần thực hiện xây dựng lại ứng dụng gốc của mình để truy cập các thay đổi gần đây nhất của bạn từ JavaScript. Điều này là do mã mà bạn đang viết nằm trong phần gốc của ứng dụng của bạn. Mặc dù gói metro của React Native có thể theo dõi các thay đổi trong JavaScript và xây dựng lại gói JS một cách nhanh chóng cho bạn, nhưng nó sẽ không làm như vậy đối với mã gốc. Vì vậy, nếu bạn muốn kiểm tra các thay đổi gốc mới nhất của mình, bạn cần xây dựng lại bằng cách sử dụng lệnh 4Tóm tắt✨Bây giờ bạn có thể gọi phương thức 6 trên mô-đun gốc của mình trong JavaScript. Vì bạn đang sử dụng 1 trong hàm, nên bạn có thể xác nhận phương thức gốc của mình đang được gọi bằng cách xem bảng điều khiển JS trong Chrome hoặc trình gỡ lỗi ứng dụng di động Flipper. Bạn sẽ thấy thông báo 7 của mình mỗi khi bạn gọi phương thức mô-đun gốcTại thời điểm này, bạn đã tạo một mô-đun gốc iOS và gọi một phương thức trên mô-đun đó từ JavaScript trong ứng dụng React Native của bạn. Bạn có thể đọc tiếp để tìm hiểu thêm về những thứ như loại đối số mà phương thức mô-đun gốc của bạn sử dụng và cách thiết lập các cuộc gọi lại và lời hứa trong mô-đun gốc của bạn Ngoài một mô-đun gốc lịchXuất mô-đun gốc tốt hơnNhập mô-đun gốc của bạn bằng cách kéo nó ra khỏi 8 như trên hơi rắc rốiĐể giúp người tiêu dùng mô-đun gốc của bạn không phải làm điều đó mỗi khi họ muốn truy cập mô-đun gốc của bạn, bạn có thể tạo trình bao bọc JavaScript cho mô-đun. Tạo một tệp JavaScript mới có tên là NativeCalendarModule. js với nội dung sau 4Tệp JavaScript này cũng trở thành một vị trí tốt để bạn thêm bất kỳ chức năng phụ nào của JavaScript. Ví dụ: nếu bạn sử dụng hệ thống kiểu như TypeScript, bạn có thể thêm chú thích kiểu cho mô-đun gốc của mình tại đây. Mặc dù React Native chưa hỗ trợ an toàn kiểu Native to JS, nhưng với các chú thích kiểu này, tất cả mã JS của bạn sẽ an toàn kiểu. Các chú thích này cũng sẽ giúp bạn dễ dàng chuyển sang các mô-đun gốc an toàn loại hơn. Dưới đây là một ví dụ về việc thêm loại an toàn vào Mô-đun Lịch 5Trong các tệp JavaScript khác của bạn, bạn có thể truy cập mô-đun gốc và gọi phương thức của nó như thế này 6
Các loại đối sốKhi một phương thức mô-đun gốc được gọi trong JavaScript, React Native sẽ chuyển đổi các đối số từ các đối tượng JS thành các đối tượng tương tự đối tượng Objective-C/Swift của chúng. Vì vậy, ví dụ: nếu phương thức Mô-đun gốc Objective-C của bạn chấp nhận NSNumber, thì trong JS, bạn cần gọi phương thức đó bằng một số. React Native sẽ xử lý chuyển đổi cho bạn. Dưới đây là danh sách các loại đối số được hỗ trợ cho các phương thức mô-đun gốc và các JavaScript tương đương mà chúng ánh xạ tới Mục tiêu-CJavaScriptNSStringstring, ?stringBOOLbooleanNSNumber?booleandoublenumberNSNumber?numberNSArrayArray, ?ArrayNSDictionaryObject, ?ObjectRCTResponseSenderBlockFunction (thành công)RCTResponseSenderBlock, RCTResponseErrorBlockFunction (thất bại)RCTPromiseResolveBlock, RCTPromiseRejectBlockPromise
Đối với iOS, bạn cũng có thể viết các phương thức mô-đun gốc với bất kỳ loại đối số nào được lớp 9 hỗ trợ (xem RCTConvert để biết chi tiết về những gì được hỗ trợ). Tất cả các chức năng của trình trợ giúp RCTConvert đều chấp nhận một giá trị JSON làm đầu vào và ánh xạ nó tới một loại hoặc lớp Objective-C gốcXuất hằng sốMột mô-đun gốc có thể xuất các hằng số bằng cách ghi đè phương thức gốc 2. Bên dưới 2 được ghi đè và trả về Từ điển chứa thuộc tính tên sự kiện mặc định mà bạn có thể truy cập bằng JavaScript như vậy 7Sau đó, hằng số có thể được truy cập bằng cách gọi 4 trên mô-đun gốc trong JS như vậy 8Về mặt kỹ thuật, có thể truy cập các hằng số được xuất trong 2 trực tiếp từ đối tượng 6. Điều này sẽ không còn được hỗ trợ với TurboModules, vì vậy chúng tôi khuyến khích cộng đồng chuyển sang phương pháp trên để tránh di chuyển cần thiết xuống dòng
Đối với iOS, nếu bạn ghi đè 2 thì bạn cũng nên triển khai 9 để cho React Native biết liệu mô-đun của bạn có cần được khởi tạo trên luồng chính hay không, trước khi bất kỳ mã JavaScript nào thực thi. Nếu không, bạn sẽ thấy một cảnh báo rằng trong tương lai mô-đun của bạn có thể được khởi chạy trên một luồng nền trừ khi bạn chọn không tham gia một cách rõ ràng với 0. Nếu mô-đun của bạn không yêu cầu quyền truy cập vào UIKit, thì bạn nên trả lời 9 bằng KHÔNGgọi lạiCác mô-đun gốc cũng hỗ trợ một loại đối số duy nhất - gọi lại. Gọi lại được sử dụng để truyền dữ liệu từ Objective-C sang JavaScript cho các phương thức không đồng bộ. Chúng cũng có thể được sử dụng để thực thi JS không đồng bộ từ phía gốc Đối với iOS, các cuộc gọi lại được triển khai bằng cách sử dụng loại 2. Bên dưới tham số gọi lại 3 được thêm vào 4 9Sau đó, bạn có thể gọi hàm gọi lại trong hàm gốc của mình, cung cấp bất kỳ kết quả nào bạn muốn chuyển đến JavaScript trong một mảng. Lưu ý rằng 2 chỉ chấp nhận một đối số - một mảng tham số để chuyển đến lệnh gọi lại JavaScript. Dưới đây, bạn sẽ trả lại ID của sự kiện được tạo trong cuộc gọi trước đó
0Phương pháp này sau đó có thể được truy cập trong JavaScript bằng cách sử dụng như sau 1Một mô-đun gốc được cho là chỉ gọi lại cuộc gọi của nó một lần. Tuy nhiên, nó có thể lưu trữ cuộc gọi lại và gọi nó sau. Mẫu này thường được sử dụng để bọc các API iOS yêu cầu đại biểu— xem ví dụ về 6. Nếu gọi lại không bao giờ được gọi, một số bộ nhớ bị rò rỉCó hai cách tiếp cận để xử lý lỗi với các cuộc gọi lại. Đầu tiên là tuân theo quy ước của Node và coi đối số đầu tiên được chuyển đến mảng gọi lại là một đối tượng lỗi 2Trong JavaScript, sau đó bạn có thể kiểm tra đối số đầu tiên để xem có lỗi nào được thông qua hay không 3Một tùy chọn khác là sử dụng hai cuộc gọi lại riêng biệt. onFailure và onSuccess 4Sau đó, trong JavaScript, bạn có thể thêm một cuộc gọi lại riêng cho các phản hồi lỗi và thành công 5Nếu bạn muốn chuyển các đối tượng giống như lỗi sang JavaScript, hãy sử dụng 7 từ 8 Hiện tại, điều này chỉ chuyển một từ điển có hình dạng Lỗi sang JavaScript, nhưng React Native nhằm mục đích tự động tạo các đối tượng Lỗi JavaScript thực trong tương lai. Bạn cũng có thể cung cấp một đối số 9, được sử dụng cho các cuộc gọi lại lỗi và chấp nhận một đối số 00. Xin lưu ý rằng loại đối số này sẽ không được hỗ trợ với TurboModuleslời hứaCác mô-đun gốc cũng có thể thực hiện một lời hứa, điều này có thể đơn giản hóa JavaScript của bạn, đặc biệt là khi sử dụng cú pháp 01 của ES2016. Khi tham số cuối cùng của một phương thức mô-đun gốc là 02 và 03, thì phương thức JS tương ứng của nó sẽ trả về một đối tượng JS PromiseTái cấu trúc đoạn mã trên để sử dụng lời hứa thay vì gọi lại trông như thế này 6Bản sao JavaScript của phương thức này trả về một Lời hứa. Điều này có nghĩa là bạn có thể sử dụng từ khóa 04 trong hàm async để gọi nó và đợi kết quả của nó 7Gửi sự kiện tới JavaScriptCác mô-đun gốc có thể báo hiệu các sự kiện tới JavaScript mà không cần gọi trực tiếp. Ví dụ: bạn có thể muốn báo hiệu cho JavaScript lời nhắc rằng một sự kiện lịch từ ứng dụng lịch iOS gốc sẽ sớm diễn ra. Cách ưa thích để thực hiện việc này là phân lớp 05, thực hiện 06 và tự gọi là 07Cập nhật lớp tiêu đề của bạn để nhập 05 và lớp con 05 8Mã JavaScript có thể đăng ký các sự kiện này bằng cách tạo một phiên bản 10 mới xung quanh mô-đun của bạnBạn sẽ nhận được cảnh báo nếu bạn sử dụng tài nguyên một cách không cần thiết bằng cách phát ra một sự kiện trong khi không có người nghe. Để tránh điều này và để tối ưu hóa khối lượng công việc của mô-đun của bạn (e. g. bằng cách hủy đăng ký nhận thông báo ngược dòng hoặc tạm dừng tác vụ nền), bạn có thể ghi đè 11 và 12 trong lớp con 05 của mình 9xâu chuỗiTrừ khi mô-đun gốc cung cấp hàng đợi phương thức của riêng nó, nó không nên đưa ra bất kỳ giả định nào về luồng mà nó đang được gọi. Hiện tại, nếu một mô-đun gốc không cung cấp hàng đợi phương thức, React Native sẽ tạo một hàng đợi GCD riêng cho nó và gọi các phương thức của nó ở đó. Xin lưu ý rằng đây là chi tiết triển khai và có thể thay đổi. Nếu bạn muốn cung cấp rõ ràng hàng đợi phương thức cho mô-đun gốc, hãy ghi đè phương thức 14 trong mô-đun gốc. Ví dụ: nếu nó cần sử dụng API iOS chỉ dành cho luồng chính, thì nó phải chỉ định điều này thông qua 0Tương tự, nếu một hoạt động có thể mất nhiều thời gian để hoàn thành, mô-đun gốc có thể chỉ định hàng đợi của chính nó để chạy các hoạt động trên. Xin nhắc lại, hiện tại React Native sẽ cung cấp một hàng đợi phương thức riêng cho mô-đun gốc của bạn, nhưng đây là chi tiết triển khai mà bạn không nên dựa vào. Nếu bạn không cung cấp hàng đợi phương thức của riêng mình, thì trong tương lai, các hoạt động chạy dài của mô-đun gốc của bạn có thể sẽ chặn các lệnh gọi không đồng bộ đang được thực thi trên các mô-đun gốc không liên quan khác. Ví dụ, mô-đun 15 ở đây tạo hàng đợi của chính nó để hàng đợi React không bị chặn khi chờ truy cập đĩa có khả năng chậm 1 16 được chỉ định sẽ được chia sẻ bởi tất cả các phương pháp trong mô-đun của bạn. Nếu chỉ một trong các phương thức của bạn đang chạy lâu (hoặc cần được chạy trên một hàng đợi khác với các phương thức khác vì lý do nào đó), bạn có thể sử dụng 17 bên trong phương thức để thực hiện mã của phương thức cụ thể đó trên một hàng đợi khác mà không ảnh hưởng đến các phương thức khác 2
Tiêm phụ thuộcReact Native sẽ tự động tạo và khởi tạo mọi mô-đun gốc đã đăng ký. Tuy nhiên, bạn có thể muốn tạo và khởi tạo các phiên bản mô-đun của riêng mình, chẳng hạn như, đưa vào các phụ thuộc Bạn có thể làm điều này bằng cách tạo một lớp triển khai Giao thức 19, khởi tạo một 20 với đại biểu làm đối số và khởi tạo một 21 với cầu khởi tạo 3Xuất SwiftSwift không hỗ trợ macro, do đó, việc hiển thị các mô-đun gốc và phương thức của chúng cho JavaScript bên trong React Native yêu cầu thiết lập nhiều hơn một chút. Tuy nhiên, nó hoạt động tương đối giống nhau. Giả sử bạn có cùng một 7 nhưng là một lớp Swift 4
Sau đó, tạo một tệp triển khai riêng sẽ đăng ký thông tin cần thiết với React Native 5Đối với những người mới làm quen với Swift và Objective-C, bất cứ khi nào bạn kết hợp hai ngôn ngữ này trong một dự án iOS, bạn cũng sẽ cần một tệp bắc cầu bổ sung, được gọi là tiêu đề bắc cầu, để hiển thị các tệp Objective-C cho Swift. Xcode sẽ đề nghị tạo tệp tiêu đề này cho bạn nếu bạn thêm tệp Swift vào ứng dụng của mình thông qua tùy chọn menu Xcode 24. Bạn sẽ cần nhập 25 trong tệp tiêu đề này 6Bạn cũng có thể sử dụng 26 và 27 để thay đổi tên JavaScript của mô-đun hoặc phương thức bạn đang xuất. Để biết thêm thông tin, xem 1
Tên phương thức dành riênglàm mất hiệu lực()Các mô-đun gốc có thể tuân thủ giao thức RCTInvalidating trên iOS bằng cách triển khai phương thức 29. Phương pháp này khi cầu gốc bị vô hiệu (tức là. khi tải lại devmode). Vui lòng sử dụng cơ chế này khi cần thiết để thực hiện dọn dẹp cần thiết cho mô-đun gốc của bạn |