2016-02-07 11 views
24

Đối với ứng dụng iOS, cập nhật giao diện người dùng được thực hiện hoàn toàn từ chủ đề chính - không làm như vậy sẽ không bao giờ được đề xuất và có thể dẫn đến hành vi không mong muốn.WatchOS: Các bản cập nhật giao diện người dùng có nên được gọi trên chuỗi chính không?

Trong watchOS, hệ điều hành được cấu trúc với tiện ích mở rộng đồng hồ và ứng dụng - như 'các vùng chứa' khác nhau. Thông thường, cập nhật giao diện người dùng được gọi từ tiện ích mở rộng và những cập nhật này có gì đó trong vùng chứa của ứng dụng.

Liệu cùng một luồng logic chính có áp dụng cho việc cập nhật giao diện người dùng từ tiện ích mở rộng của đồng hồ hoặc có thể gọi cập nhật giao diện người dùng từ nền không?


Chỉnh sửa - để mang lại sự rõ ràng. Từ vùng chứa của ứng dụng, cập nhật giao diện người dùng có thể xảy ra trên luồng chính (như xảy ra ở hầu hết các hệ thống/HĐH, như được chỉ ra bên dưới). Câu hỏi thực sự là liệu watchOS có xử lý điều đó cho chúng tôi hay không, tức là việc gọi cập nhật giao diện người dùng trên chuỗi nền của tiện ích mở rộng sẽ tự động được đăng lên chủ đề chính của vùng chứa ứng dụng cho chúng tôi hay không.

+0

Bạn có yêu cầu ** nên ** chúng được gọi trên ** chuỗi chính ** hoặc ** có thể ** chúng được gọi trên chuỗi nền ** không? – tktsubota

+0

@TroyT cả hai câu lệnh có vẻ tương đương với tôi, nhưng tôi đoán câu lệnh 'nên' chính xác hơn. Nếu một cái gì đó 'không nên' được gọi là trên nền, tôi sẽ không làm điều đó. Khá nhiều - "không cùng một logic giao diện người dùng chủ đề chính từ iOS áp dụng cho watchOS?" –

Trả lời

1

Sau khi liên hệ với Apple thông qua sự cố Hỗ trợ kỹ thuật, câu trả lời và giải thích đã nhận được bên dưới.

TLDR: sử dụng chuỗi chính.

Tất cả các cập nhật phải được thực hiện từ chuỗi chính. Điều này luôn luôn là là khuyến nghị chung cho UIKit và đề xuất đó mở rộng sang watchOS.

Có thể hữu ích khi hiểu lý do cơ bản cho yêu cầu này. Hãy nhớ rằng, ngay cả với kênh truyền thông tập trung để sắp xếp lại các thay đổi, nhiều vấn đề nảy sinh khi bạn cố gắng thao tác trạng thái giao diện người dùng từ các chủ đề nền. Ví dụ: trong khi kênh tuần tự có thể ngăn nhiều lệnh UI cố gắng để thực thi đồng thời, nó không thể kiểm soát thứ tự trong đó lệnh không liên quan sẽ thực thi. Hãy xem xét 2 khối sau:

block 1 {  
    DoUIChange1  
    DoUIChange2  
} 

block 2 {  
    DoUIChange3  
    DoUIChange4  
} 

Nếu cả hai khối được thực hiện trên các chủ đề chính, sau đó thực tế lệnh suối là một trong hai:

DoUIChange1 
DoUIChange2 
DoUIChange3 
DoUIChange4 

hoặc ...

DoUIChange3 
DoUIChange4 
DoUIChange1 
DoUIChange2 

Tuy nhiên, nếu cả hai khối được thực thi theo chủ đề của riêng chúng, thậm chí nhiều khả năng hơn mở ra:

DoUIChange3 
DoUIChange1 
DoUIChange2 
DoUIChange4 

hoặc ..

DoUIChange1 
DoUIChange3 
DoUIChange2 
DoUIChange4 

hoặc ..

DoUIChange1 
DoUIChange3 
DoUIChange4 
DoUIChange2 

vv ...

Không cần phải nói, nếu mã UI là ở tất cả các phức tạp số lượng kết hợp một cách nhanh chóng trở thành to lớn, khiến lỗi giao diện người dùng không mong muốn về cơ bản là không thể tránh khỏi.

-1

Bạn nên luôn cập nhật giao diện người dùng trên chuỗi chính. Không làm như vậy sẽ dẫn đến hiển thị giao diện người dùng chậm hơn hoặc sự cố ứng dụng tiềm năng. Điều này không dành riêng cho iOS hoặc watchOS, vì hầu hết mọi ngôn ngữ lập trình (C#, Java, C++, v.v.) đều yêu cầu bạn cập nhật giao diện người dùng trên chuỗi chính.

Trong watchOS 1, những gì bạn đang đề xuất có thể có ý nghĩa vì tiện ích nằm trên iPhone và giao diện người dùng trên đồng hồ. Trong trường hợp đó, ứng dụng đã chạy dưới dạng hai quy trình riêng biệt và bạn "Có thể" không cần gửi đến chủ đề chính để cập nhật giao diện người dùng. Nhưng trong watchOS 2 thì nó khác. Ngay cả tiện ích watchOS và UI đều có các mục tiêu khác nhau, trong watchOS 2 chúng không chạy như các quy trình riêng biệt trên đồng hồ (bạn có thể xác minh điều này bằng cách xem các quy trình đang chạy trên đồng hồ Apple trong Xcode và thấy rằng chỉ có một cho mỗi ứng dụng) . Chỉ vì nó được đóng gói như hai thùng chứa riêng biệt (và thậm chí được ký khác nhau) không có nghĩa là chúng chạy như hai quá trình riêng biệt trên đồng hồ.

+0

Tôi nghe những gì bạn đang nói, nhưng tôi không đồng ý/sẽ không nói rằng đây là câu trả lời có thể chấp nhận được.Đối với một ứng dụng và tiện ích mở rộng xem trực tiếp trong các vùng chứa hoàn toàn khác nhau. Họ hầu như không biết gì về người khác. Làm thế nào để bạn biết họ là quá trình tương tự? –

+0

Khi bạn gọi cập nhật giao diện người dùng từ chuỗi tiện ích mở rộng nền, làm thế nào để bạn biết rằng watchOS không gọi cập nhật giao diện người dùng chủ đề chính trong vùng chứa của ứng dụng, tương ứng? Câu hỏi là không thực sự cho dù cập nhật giao diện người dùng nói chung nên được thực hiện trên các chủ đề chính, đó là một nhất định. Thay vào đó - từ 'mở rộng', nó nên được thực hiện trên luồng chính - hay là được xử lý cho chúng ta, và chúng ta có thể gọi từ một chuỗi nền mà không cần phải nhảy trở lại chính cho mỗi cập nhật giao diện người dùng không? –

+0

Đầu tiên, nhảy giữa các quá trình sẽ làm tăng thời gian trễ đáng chú ý. Thứ hai, bạn có thể đính kèm Xcode vào các tiến trình đang chạy trên đồng hồ Apple của bạn khi iPhone của bạn được cắm vào và đồng hồ có thể truy cập được (Debug -> Attach To Process). Bạn sẽ nhận thấy rằng chỉ có quy trình mở rộng có sẵn để đính kèm. Thứ ba, tôi đã gặp phải rất nhiều lỗi giao diện người dùng và sự cố trên watchOS vì không quay trở lại luồng giao diện người dùng sau khi thực hiện cuộc gọi không đồng bộ (chủ yếu là truy vấn bộ y tế). – lehn0058

4

Apple App Programming Guide for watchOS có thể là hướng dẫn dứt khoát, nhưng tôi không thể tìm thấy tham chiếu trong đó liên quan đến cập nhật giao diện người dùng trên các chủ đề khác ngoài chuỗi chính.

Chúng tôi từng nghĩ rằng nếu điều quan trọng là giao diện người dùng cập nhật chính xác được gọi từ các chủ đề chính, mà nó sẽ nói rõ ở đâu đó (giống như trong các App Programming Guide for iOS, trong Threads and Concurrency section) là:

làm việc liên quan đến chế độ xem, Hoạt ảnh chính và nhiều lớp UIKit khác thường phải xảy ra trên chuỗi chính của ứng dụng. Có một số ngoại lệ đối với quy tắc này — ví dụ: thao tác dựa trên hình ảnh thường có thể xảy ra trên các chủ đề nền — nhưng khi nghi ngờ, giả định rằng công việc cần phải xảy ra trên chuỗi chính.

Mặc dù, báo giá ở trên có thể được hiểu là đúng với cập nhật giao diện người dùng cho tiện ích mở rộng Đồng hồ, kể từ khi tiện ích mở rộng đang chạy trên iOS.

Tất cả những điều trên để nói, tôi không tin có bất kỳ tài liệu nào của Apple nêu rõ cách này hay cách khác.

Đây là một điểm dữ liệu khác: Mặc dù: Lister sample code của Apple hiện bao gồm phần mở rộng WatchKit và từ nghiên cứu ngắn gọn về nó, có vẻ như gửi đi hàng đợi đến hàng đợi nền (xem ListInfo.swift: 34) và cập nhật giao diện người dùng theo gửi trở lại hàng đợi chính (ListsInterfaceController.swift: 98).Thậm chí có một bình luận trong đó nói rằng nó làm điều đó:

Các fetchInfoWithCompletionHandler (_ :) phương pháp gọi là xử lý hoàn thành trên một hàng đợi nền , cử lại vào hàng đợi chính để thực hiện cập nhật giao diện người dùng.

Tôi nghĩ dựa trên ở trên, tôi sẽ sai về mặt cập nhật trên chuỗi chính, trừ khi bạn xác định có hiệu suất hoặc các tác động khác của việc làm như vậy.

+0

Tuyệt vời, đó là một số logic rắn hơn ở đó - thật không may, hai điều mà tôi không 100% thuyết phục về: như watchOS 2, phần mở rộng không còn chạy trên iOS, nhưng trên watchOS - mà quầy quy tắc của bạn sau logic iOS. Thứ hai - tôi tin rằng mã mẫu lister sử dụng cuộc gọi đó nhiều hơn chỉ là phần mở rộng đồng hồ, đó là lý do tại sao nó đòi hỏi các cuộc gọi trở lại chủ đề chính - mã có thể chạy như một phần của ứng dụng iOS thay thế. Tôi sẽ ngừng cung cấp tiền thưởng. –

+0

Quan điểm của bạn về sự thận trọng ở khía cạnh thận trọng, bây giờ, là điều duy nhất tôi hoàn toàn bị thuyết phục! Cảm ơn vì câu trả lời. Theo lý do tôi muốn biết - tôi chỉ muốn không có 50 cuộc gọi trở lại chủ đề chính không cần thiết. Nó có thể làm cho các cập nhật giao diện người dùng xảy ra một runloop sau đó, không phải là một vấn đề lớn nhưng mỗi bit đếm phản ứng. –

+0

cho câu trả lời của bạn đã được tự động lựa chọn cho tiền thưởng, tôi nghĩ bạn có lẽ nên chỉnh sửa nó để lấy đi bất kỳ báo cáo không chính xác. Tôi rất sẵn lòng tạm thời đánh dấu nó là câu trả lời chính xác cho đến khi tìm thấy một thứ gì đó chắc chắn hơn. –

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