আমি ব্যবহার করি না Mail.app এবং বাস্তবায়ন অনেক অভিজ্ঞতা আছে মেইল কর্ম , তাই আপনার স্ক্রিপ্ট পরীক্ষা করার অবস্থানে নেই। যাইহোক, এটি মাধ্যমে পড়া, সম্ভাব্য উদ্বেগের মধ্যে জায়গা আছে যে আমি ডিবাগিং যখন প্রথম দিকে তাকান করতে চাই।
আপনার বড় কত "সংবাদ" মেইলবক্স?
আপনার স্ক্রিপ্টে দুটি বৈশিষ্ট্য রয়েছে যা হ hang বা সময়সীমাতে হুমকি দেয়:
1। set EveryMessage to every message of TargetInbox
যদি সেই মেইলবক্সটিতে হাজার হাজার বা এমনকি শত শত ইমেল রয়েছে, পুনরুদ্ধার করা হচ্ছে every message
পৃথকভাবে উল্লেখ একটি তালিকা হিসাবে message
বস্তু (যা এই বিবৃতি কি করছে) কিছু সময় নিতে পারে। এটি প্রায় সবসময় আরও কার্যকর এবং প্রসেসর এবং মেমরি ব্যবহার সঞ্চয় কম গভীরতর উপায় a reference to
দ্য every message
বস্তু (সংগ্রহ):
set EveryMessage to a reference to every message of the TargetInbox
এটি আরেকটি উপকারী বৈশিষ্ট্য যা আমি পরে উল্লেখ করব।
2. সম্ভাব্য নেস্টেড দাবি repeat
লুপ
Nested loops কখনও কখনও একটি প্রয়োজনীয় মন্দ হয়, কিন্তু মেলবক্স আকার সম্পর্কে প্রশ্ন আবার, আমার জন্য উদ্বেগ একটি উত্স, বিশেষ করে যেহেতু এটি নিখরচায় হৃদয় যেখানে বলা হয় অপারেশন প্রচুর কাজ করা হয়। এর অর্থ হল, স্ক্রিপ্টটি ট্রিগার করে এমন প্রতিটি নতুন বার্তাগুলির জন্য, মেলবক্সে থাকা প্রতিটি একক বার্তাটি ট্রিগার বার্তাটির সাথে তুলনা করা উচিত।
এটি একটি ইস্যুর দুটি শাখা, সত্যিই, কারণ যদি আপনার মেলবক্সটিতে কেবল 5 টি বার্তা থাকে তবে এটির মধ্যে কোনটি বিশেষত বিরক্তিকর নয়। অন্যথায়, আপনি প্রথমে মেলবক্সে প্রতিটি বার্তা পুনরুদ্ধার করতে এবং একটি পরিবর্তনশীলতে সেগুলি সংরক্ষণ করতে অ্যাপলস্ক্রিপ্ট পেয়ে যাচ্ছেন; তারপর এই সম্ভাব্য ভারী লোড মাধ্যমে সাইকেল চালানো এবং প্রতিটি আইটেম অন্য একটি তুলনা।
আপনি ব্যবহার করার জন্য কিন্তু কোন পছন্দ ছিল repeat
লুপ যখন অনেকগুলি তালিকা আইটেমের মাধ্যমে পুনরাবৃত্তি করতে হবে তা জানার সময় (একবার আপনি প্রায় 500 এরও বেশি কিছু পরে, অ্যাপলস্ক্রিপ্ট ফিরতে শুরু করতে পারে) এটি আবারও অ্যাপলস্ক্রিপ্টটি পাস করতে সহায়তা করে। উল্লেখ পরিবর্তে প্রকৃত তালিকার আইটেম তালিকা। একটি মাধ্যমে কোন রেফারেন্স পাস স্ক্রিপ্ট বস্তু (যা কি a reference to
মূলতঃ), অ্যাপলস্ক্রিপ্টটি অন্য উপায়ে একটি বস্তু অ্যাক্সেস করার চেয়ে অনেক বেশি দ্রুত। এখানে এই নীতির একটি চমৎকার ব্যাখ্যা এবং বিক্ষোভ ।
সহজ পরিবর্তন এবং ত্রুটি সংশোধন
উপরে ভারী সমস্যাটি সমাধান করার পরে, যা আপনার বিশেষ ক্ষেত্রে সামান্য প্রাসঙ্গিকতা হতে পারে, এখানে এক বা দুটি সত্যিকারের উপাদান যা সহজেই স্ক্রিপ্টটির দক্ষতা উন্নত করতে পরিবর্তিত হয়, অথবা এটি একটি ত্রুটি নিক্ষেপ করতে বাধা দেয়:
1. পরিবর্তনশীল ঘোষণা স্থান
set eachSender to the sender of eachMessage
এই লাইন বর্তমানে অভ্যন্তরের ভিতর ঘোষণা করা হয় repeat
লুপ, যা সাধারণ hypothetical পদে, উভয় meatier হতে হবে। যাইহোক, এই কি করছেন পরিবর্তনশীল মান নির্ধারণ করা হয় eachSender
আপনার মেইলবক্সে আপনার যতগুলি বার্তা আছে তার জন্য একই মান। এটি অ্যাপলস্ক্রিপ্টের জন্য প্রচুর অপচয়যুক্ত অপারেশন (মোট সংখ্যা these_messages
দ্বারা গুণিত সংখ্যা EveryMessage
)।
পরিবর্তে, এখানে এটি সরান:
repeat with eachMessage in these_messages
set eachSender to the sender of eachMessage # ...now it's here
repeat with this_message in EveryMessage
# It was here...
.
.
.
end repeat
end repeat
এখন অ্যাপলস্ক্রিপ্টের জন্য শুধুমাত্র একবার পরিবর্তনশীল সেট করা আছে eachMessage
মধ্যে these_message
। যে রৈখিক সময় নিচে বহুবর্ষজীবী সময় একটি দক্ষতা উন্নতি!
2। set messageDate to date received of EveryMessage
প্রাথমিকভাবে, আমি ভেবেছিলাম আপনি অ্যাক্সেস করার চেষ্টা করছেন EveryMessage
বস্তুটিকে আমি আগে কথোপকথনের রেফারেন্স হিসাবে উল্লেখ করেছি এবং সহজেই বুঝতে পারছি না যে আপনি যে ভাবে ঘোষণা করেছিলেন সেটি আপনি করতে পারছেন না EveryMessage
।
কিন্তু, আমি এখন বুঝতে পারি এটি সম্ভবত আপনার হাতের চেয়ে আপনার হাতের দ্রুত টাইপ করা এবং একটি বিরক্তিকর টাইপো প্রবর্তন করা। EveryMessage
এখানে হতে কর্তব্য this_message
, i.e .:
set messageDate to date received of this_message
এটি আমার চূড়ান্ত বিন্দুতে বেশ সুন্দরভাবে পরিচালিত করে, যা আমি আগেই ইঙ্গিত দিয়েছিলাম, একটি রেফারেন্স হিসাবে একটি বস্তুর সংগ্রহে একটি পরিবর্তনশীল ঘোষণা করার অন্যান্য সুবিধা সম্পর্কে।
আপনি এই কাজ করে থাকেন:
set EveryMessage to a reference to every message of the TargetInbox
তারপর এই:
set messageDate to date received of EveryMessage
অ্যাপলস্ক্রিপ্টের পুরোপুরি বৈধ টুকরা হবে, যা আপনাকে তালিকার প্রতিটি আইটেমের সম্পত্তি অ্যাক্সেস করতে দেয় IFF Dereferencing এর যে কোনও ধরণের স্থান গ্রহণ করার আগে সেই তালিকাটির একটি রেফারেন্সের মাধ্যমে সম্পন্ন হয়েছে। একবার এটি বাতিল করা হয়ে গেলে, তালিকাটি পৃথক বস্তুর রেফারেন্সগুলিতে মূল্যায়ন করা হয় এবং এটি আপনাকে তার উপায়ে তার বৈশিষ্ট্যগুলির মাধ্যমে গণনা করার উপায় সরবরাহ করবে না।
সঠিকভাবে সম্পন্ন হলে আপনি কী পাবেন তার তালিকা রয়েছে date received
সম্পত্তি every message of the TargetInbox
, সব অ্যাপলস্ক্রিপ্ট একক লাইন মাধ্যমে।
বর্তমানে, এটি আপনি কিভাবে প্রয়োগ করেছিলেন তা নয়, ঘোষণার জন্য set messageDate
ইচ্ছাশক্তি স্পষ্টভাবে একটি ত্রুটি নিক্ষেপ।
এটি ব্যাখ্যা করে যে কেন কোনও মুছে ফেলা হচ্ছে না, কারণ আপনার স্ক্রিপ্ট সফলভাবে সেই অংশে পৌঁছাবে না। যাইহোক, ত্রুটি অবিলম্বে ঘটতে পারে, তাই আমার অনুভূতি হয় যে স্ক্রিপ্টটি এমনকি সেই লাইনটিতে পৌঁছাতে পারে না, এমনকি একবারও নয়। অতএব, সমস্যাটি অভ্যন্তরীণভাবে সফলভাবে প্রবেশ করার আগে স্ক্রিপ্টের একটি বিন্দু থেকে উদ্ভূত হওয়া আবশ্যক repeat
লুপ. এবং আপনি ইতিমধ্যে যে সম্পর্কে আমার গুচ্ছ জানি।
এখন একটি সম্ভাব্য সমাধান জন্য
আমি দুঃখিত যে আমি আসলেই আমার স্ক্রিপ্টটি যাচাই করতে পারছি না যে এটি নিশ্চিতভাবেই প্রথমবার কোনও পরিবর্তন ছাড়াই কাজ করবে, তাই আমাকে বলুন কিভাবে আপনি এটির সাথে কীভাবে চলতে পারেন:
using terms from application "Mail"
on perform mail action with messages these_messages
tell application "Mail"
set everyMessage to a reference to messages in mailbox "News" of account "iCloud"
repeat with eachMessage in these_messages
delete (everyMessage where ¬
the date received is not the (current date) ¬
and its sender is the sender of eachMessage)
end repeat
end tell
end perform mail action with messages
end using terms from
আপনি দেখতে পারেন, আমি ভেতরের অধিকাংশ সঙ্গে সম্পূর্ণরূপে কাজ করেছেন repeat
লুপ ধন্যবাদ ব্যবহার করুন a reference to
অপারেটর. আমি ঘোষণা হিসাবে everyMessage
এইভাবে, আমি (আশা করছি) তালিকায় থাকা সমস্ত আইটেমগুলির বৈশিষ্ট্যগুলি গণনা করতে সক্ষম, যা পৃথকভাবে প্রতিটি আইটেমের জন্য সম্পত্তি চেক করার চেয়ে আনুমানিক গুণমানের চেয়ে দ্রুত হওয়া উচিত।
display dialog "Hi"
যা জাভাস্ক্রিপ্টের সমতুল্য সতর্কতা ("হাই") এর মত, পুনরাবৃত্তিগুলিতে পরীক্ষা করে দেখুন যে তারা সঠিকভাবে পুনরায় প্রদর্শিত হচ্ছে কিনা। তারপর আপনি যে পরিবর্তনশীলটি ব্যবহার করেন তার সাথে হাইকে স্যুইচ করুন (যেমনthis_message
) তাই আপনি নিশ্চিত করতে পারেন যে পরিবর্তনশীল সঠিক।