উত্তর:
প্রথমত আমি আপনার দৃষ্টি আকর্ষণ করতে চাই কোকো / সিএফ ডকুমেন্টেশনের দিকে (যা সর্বদা কলের দুর্দান্ত পোর্ট)। অ্যাপল ডক্সের প্রতিটি রেফারেন্স নিবন্ধের শীর্ষে একটি অংশ রয়েছে "কমপীয়ান গাইডস", যা এই বিষয়টির নথিবদ্ধ (যদি উপস্থিত থাকে) জন্য গাইড নির্দেশ করে exist উদাহরণস্বরূপ, সঙ্গে NSTimer
, ডকুমেন্টেশন তালিকা দুই সহচর গাইড:
আপনার পরিস্থিতির জন্য, টাইমার প্রোগ্রামিং বিষয়গুলির নিবন্ধটি সবচেয়ে কার্যকর হতে পারে, থ্রেডিংয়ের বিষয়গুলি সম্পর্কিত হলেও ডকুমেন্টিং ক্লাসের সাথে সর্বাধিক সরাসরি সম্পর্কিত নয়। আপনি যদি টাইমার প্রোগ্রামিং বিষয়গুলির নিবন্ধটি একবার দেখেন তবে এটি দুটি ভাগে বিভক্ত:
এই নিবন্ধটি গ্রহণ করে এমন নিবন্ধগুলির জন্য, প্রায়শই ক্লাস এবং এটির জন্য কী ব্যবহার করা হয় তার একটি সংক্ষিপ্তসার থাকে এবং তারপরে "টাইমার্স ব্যবহার করে" বিভাগে এই ক্ষেত্রে কীভাবে এটি ব্যবহার করতে হবে সে সম্পর্কে কিছু নমুনা কোড । "একটি টাইমার তৈরি এবং সময় নির্ধারণ", "একটি টাইমার থামানো" এবং "মেমরি পরিচালনা" বিভাগ রয়েছে are নিবন্ধ থেকে, একটি নির্ধারিত, অ-পুনরাবৃত্তি টাইমার তৈরি করা এরকম কিছু করা যেতে পারে:
[NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(targetMethod:)
userInfo:nil
repeats:NO];
এটি একটি টাইমার তৈরি করবে যা ২.০ সেকেন্ড পরে চালিত হয় এবং targetMethod:
এটি self
একটি আর্গুমেন্টের সাথে কল করে , যা এটির নির্দেশকNSTimer
উদাহরণের ।
এরপরে আপনি যদি পদ্ধতিটিতে আরও বিশদটি দেখতে চান তবে আরও তথ্যের জন্য আপনি ডক্সে আবার উল্লেখ করতে পারেন, তবে কোডের চারপাশেও ব্যাখ্যা রয়েছে।
যদি আপনি একটি টাইমার যা পুনরাবৃত্তি করে তা বন্ধ করতে চান, (অথবা আগুন জ্বালানোর আগে একটি পুনরাবৃত্তি টাইমার থামিয়ে দিতে পারেন) তবে আপনাকে NSTimer
তৈরি হওয়া দৃষ্টান্তের জন্য একটি পয়েন্টার রাখতে হবে ; প্রায়শই এটির ক্ষেত্রে পরিবর্তনশীল হওয়া দরকার যাতে আপনি এটি অন্য পদ্ধতিতে উল্লেখ করতে পারেন। এর পরে আপনি কল করতে পারেন invalidate
উপর NSTimer
উদাহরণস্বরূপ:
[myTimer invalidate];
myTimer = nil;
nil
ইনস্ট্যান্স ভেরিয়েবলটি আউট করার পক্ষে এটিও ভাল অনুশীলন (উদাহরণস্বরূপ যদি আপনার পদ্ধতিটি টাইমারকে অবৈধ করে দেয় তবে যদি একাধিকবার কল করা হয় এবং উদাহরণটি ভেরিয়েবলটি সেট না করা থাকে nil
এবং NSTimer
উদাহরণটি বাতিল করা হয়েছে, তবে এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে)।
নিবন্ধের নীচে মেমরি ম্যানেজমেন্টের বিষয়টিও নোট করুন:
কারণ রান লুপটি টাইমারটি বজায় রাখে, মেমরি পরিচালনার দৃষ্টিকোণ থেকে সাধারণত এটি নির্ধারণ করার পরে টাইমারকে রেফারেন্স রাখার দরকার নেই । যেহেতু আপনি যখন নির্বাচক হিসাবে তার পদ্ধতিটি নির্দিষ্ট করেন তখন টাইমার আর্গুমেন্ট হিসাবে পাস হয়, আপনি সেই পদ্ধতির মধ্যে উপযুক্ত হলে পুনরাবৃত্তি টাইমারকে অকার্যকর করতে পারেন । তবে অনেক পরিস্থিতিতে আপনি টাইমারকে অবৈধ করার বিকল্পটি চান want সম্ভবত এটি শুরু হওয়ার আগেই। এই ক্ষেত্রে, আপনাকে টাইমারটির একটি রেফারেন্স রাখা দরকার, যাতে যখনই উপযুক্ত হয় আপনি এটিকে একটি অবৈধ বার্তা পাঠাতে পারেন। যদি আপনি একটি নির্ধারিত টাইমার তৈরি করেন ("আনসুলেডেড টাইমারগুলি দেখুন"), তবে আপনাকে অবশ্যই টাইমারটির একটি দৃ reference় রেফারেন্স বজায় রাখতে হবে (একটি রেফারেন্স-গণনা করা পরিবেশে, আপনি এটি ধরে রাখবেন) যাতে এটি ব্যবহার করার আগে এটির dellocated না হয়।
YES
করবেন repeats:
তখন পাস করতেন scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
। যদি আপনি এটি করেন তবে অবশ্যই NSTimer
উদাহরণটি (এটি পদ্ধতি দ্বারা প্রত্যাবর্তিত হয়েছে) একটি রেফারেন্স রাখা নিশ্চিত করুন এবং মেমরি ম্যানেজমেন্টের পয়েন্টটি আমি উপরে বর্ণিত অনুসরন করুন।
target
এবং এর সাথে নির্দিষ্ট করেছেন selector
। উদাহরণস্বরূপ, যদি আপনার টার্গেট হল self
এবং নির্বাচক হয় timerMethod:
, পদ্ধতি নামক যখন টাইমার দাবানল হয় timerMethod:
সংজ্ঞাসমূহ self
। তারপরে আপনি সেই পদ্ধতিতে আপনার যে কোডটি চান তা রাখতে পারেন এবং যখনই টাইমার জ্বলতে থাকে তখন পদ্ধতিটি কল হবে। নোট করুন যে টাইমার অগ্নিকাণ্ডের সময় ডেকে আনা পদ্ধতিটি (যে হিসাবে আপনি পাস করেছেন selector:
) কেবলমাত্র একটি যুক্তি নিতে পারে (যা বলা হলে এটি NSTimer
উদাহরণের জন্য নির্দেশক )।
self
"
টাইমার ব্যবহারের কয়েকটি উপায় রয়েছে:
1) নির্ধারিত টাইমার এবং নির্বাচক ব্যবহার
NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 2.0
target: self
selector:@selector(onTick:)
userInfo: nil repeats:NO];
পার্শ্ব নোট হিসাবে, এমন টাইমার ব্যবহারের পরিবর্তে যা পুনরাবৃত্তি না করে এবং নির্দিষ্ট ব্যবধানের পরে নির্বাচককে কল করে আপনি এই জাতীয় বক্তব্যটি ব্যবহার করতে পারেন:
[self performSelector:@selector(onTick:) withObject:nil afterDelay:2.0];
এটি উপরের নমুনা কোডের মতো একই প্রভাব ফেলবে; তবে আপনি যদি প্রতি নবম বার নির্বাচককে কল করতে চান, আপনি পুনরাবৃত্তি সহ টাইমারটি ব্যবহার করুন: হ্যাঁ;
2) স্ব-নির্ধারিত টাইমার
NSDate *d = [NSDate dateWithTimeIntervalSinceNow: 60.0];
NSTimer *t = [[NSTimer alloc] initWithFireDate: d
interval: 1
target: self
selector:@selector(onTick:)
userInfo:nil repeats:YES];
NSRunLoop *runner = [NSRunLoop currentRunLoop];
[runner addTimer:t forMode: NSDefaultRunLoopMode];
[t release];
3) নির্ধারিত টাইমার এবং অনুরোধ ব্যবহার করে
NSMethodSignature *sgn = [self methodSignatureForSelector:@selector(onTick:)];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature: sgn];
[inv setTarget: self];
[inv setSelector:@selector(onTick:)];
NSTimer *t = [NSTimer timerWithTimeInterval: 1.0
invocation:inv
repeats:YES];
এবং তার পরে, আপনি যখনই এর মতো প্রয়োজন হয় তখন আপনি নিজেই টাইমারটি শুরু করেন:
NSRunLoop *runner = [NSRunLoop currentRunLoop];
[runner addTimer: t forMode: NSDefaultRunLoopMode];
এবং একটি নোট হিসাবে, অনটিক: পদ্ধতিটি দেখতে এরকম:
-(void)onTick:(NSTimer *)timer {
//do smth
}
এটার মতো কিছু:
NSTimer *timer;
timer = [NSTimer scheduledTimerWithTimeInterval: 0.5
target: self
selector: @selector(handleTimer:)
userInfo: nil
repeats: YES];
#import "MyViewController.h"
@interface MyViewController ()
@property (strong, nonatomic) NSTimer *timer;
@end
@implementation MyViewController
double timerInterval = 1.0f;
- (NSTimer *) timer {
if (!_timer) {
_timer = [NSTimer timerWithTimeInterval:timerInterval target:self selector:@selector(onTick:) userInfo:nil repeats:YES];
}
return _timer;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}
-(void)onTick:(NSTimer*)timer
{
NSLog(@"Tick...");
}
@end
MyViewController
কখনই বিঘ্নিত হয় না।
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(timerCalled) userInfo:nil repeats:NO];
-(void)timerCalled
{
NSLog(@"Timer Called");
// Your Code
}
উত্তরগুলি এখানে পরবর্তী টাইমের একটি নির্দিষ্ট সময় অনুপস্থিত:
NSCalendarUnit allUnits = NSCalendarUnitYear | NSCalendarUnitMonth |
NSCalendarUnitDay | NSCalendarUnitHour |
NSCalendarUnitMinute | NSCalendarUnitSecond;
NSCalendar *calendar = [[ NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *weekdayComponents = [calendar components: allUnits
fromDate: [ NSDate date ] ];
[ weekdayComponents setHour: weekdayComponents.hour + 1 ];
[ weekdayComponents setMinute: 0 ];
[ weekdayComponents setSecond: 0 ];
NSDate *nextTime = [ calendar dateFromComponents: weekdayComponents ];
refreshTimer = [[ NSTimer alloc ] initWithFireDate: nextTime
interval: 0.0
target: self
selector: @selector( doRefresh )
userInfo: nil repeats: NO ];
[[NSRunLoop currentRunLoop] addTimer: refreshTimer forMode: NSDefaultRunLoopMode];
অবশ্যই, আপনার শ্রেণীর পছন্দসই পদ্ধতিতে "doRefresh" বিকল্প করুন
একবার ক্যালেন্ডার অবজেক্ট তৈরি করার চেষ্টা করুন এবং দক্ষতাগুলির জন্য allUnits কে একটি স্ট্যাটিক করুন make
এক থেকে এক ঘন্টা উপাদান যুক্ত করা ঠিক কাজ করে, মধ্যরাতের পরীক্ষার প্রয়োজন নেই ( লিঙ্ক )