আমি কীভাবে 1 সেকেন্ডের জন্য কোনও পদ্ধতি কলকে বিলম্ব করতে পারি?


164

কোনও পদ্ধতিতে 1 সেকেন্ডের জন্য কোনও সহজ কলম্বের বিলম্ব কী?

আমার একটি রয়েছে UIImageViewযা একটি স্পর্শ ইভেন্টে প্রতিক্রিয়া জানায়। স্পর্শটি সনাক্ত করা গেলে অ্যাপে কিছু অ্যানিমেশন ঘটে happen এক সেকেন্ডের পরে, আমি অন্য পদ্ধতিটি কল করতে চাই। এই ক্ষেত্রে আমি animationDidStopনির্বাচকটি ব্যবহার করতে পারি না ।


অবশ্যই এটি করার বিভিন্ন উপায় রয়েছে, তাদের মধ্যে একটি হ'ল বেশিরভাগ মিলিসেকেন্ডের জন্য প্রোগ্রাম / থ্রেড স্থগিত করার জন্য ঘুম () ব্যবহার করা যেতে পারে, তবে আমি মনে করি আপনি ঠিক কীটি সম্পাদন করতে চাইছেন তা আমাদের বলতে চাইবেন এটা করছ? মানে, আপনার আসল সমস্যাটি কী? কোনও পদ্ধতির কলকে বিলম্ব করার ধারণাটিকে 'সমাধান' বলে মনে হচ্ছে, এটি সত্য যা সত্য বলে মনে হয় খুব ভাল বলে মনে হয় না। সুতরাং, আপনার মনে থাকা দৃশ্যের বিষয়ে কেবল আমাদের আরও বলুন।
কেউ

উত্তর:


254
performSelector:withObject:afterDelay:

নথি রেফারেন্স


7
এটা সঠিক উত্তর. দয়া করে বিকাশকারী.অ্যাপল.
ক্ষতিগ্রস্থ

যে পদ্ধতিটি ডাকা হয় তার রিটার্ন মান সহ কোনও কিছুর উপায় আছে? অথবা আমি যদি এ থেকে কিছু তথ্য ফিরে পেতে চাই তবে প্যারামিটারটি সংশোধন করার জন্য আমার এটি সেট আপ করা দরকার?
গর্ডন গুস্তাফসন

যদি কেউ আগ্রহী কীভাবে নির্ধারিত কলটি বাতিল করতে হয়: [এনএসবজেক্ট বাতিলপ্রিপ্রিফারফর্মপ্রেরেসুইটস উইথট্যারেট: আপনার টার্গেট সিলেক্টর: এলেক্টর অবজেক্ট: এনআরগমেন্ট];
আমাদের 21

192

আপনি একটি ব্লক ব্যবহার করতে পারে

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [object method]; 
});

বেশিরভাগ সময় আপনি dispatch_get_main_queue ব্যবহার করতে চাইবেন, যদিও পদ্ধতিতে কোনও UI না থাকলে আপনি একটি বিশ্বব্যাপী সারি ব্যবহার করতে পারেন ।

সম্পাদনা:

সুইফট 3 সংস্করণ:

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
    object.method()
}

একইভাবে, DispatchQueue.global().asyncAfter(...এছাড়াও একটি ভাল বিকল্প হতে পারে।


স্ট্রেইট সি এবং ওবিজেসি মেশানোর সময় এই সমাধানটি পারফরম্যান্সের তুলনায় আরও সহজ হিসাবে পাওয়া গেছে
পল

1
দুর্ভাগ্যক্রমে ডিসপ্যাচ_জেট_কন্টেন_উইউটি
আইওএস 6-এর

3
ডিসপ্যাচ_জেট_কন্টেন_কিউ
এমসিএফিডার এর

2
এক্সকোড এখন এটি স্বয়ংক্রিয়ভাবে সম্পন্ন করবে, কেবল টাইপিং শুরু করুন dispatch_afterএবং এন্টার টিপুন
এমসিএফিডার

1
বিশেষত এখন টাইপ করার সময় এক্সকোড এটিকে স্বয়ংক্রিয়ভাবে পূর্ণ করে তোলে dispatch_after, এটি করার জন্য এটি সত্যিই একটি দুর্দান্ত সোজা উপায়, এছাড়াও আপনি যে পদ্ধতিতে কল করছেন তার বৈশিষ্ট্যগুলিতে আপনি স্থান দিতে পারেন যা দুর্দান্ত।
এরিক ভ্যান ডের নিউট

128

করার সর্বোত্তম উপায় হ'ল:

[self performSelector:@selector(YourFunctionName) 
           withObject:(can be Self or Object from other Classes) 
           afterDelay:(Time Of Delay)];

আপনি অবজেক্ট প্যারামিটার হিসাবে শূন্য করতে পারবেন।

উদাহরণ:

[self performSelector:@selector(subscribe) withObject:self afterDelay:3.0 ];

3
আপনি কেন নিজেকে নিতেন?
এরিক

2
এবং কেন আপনি শূন্য আর্গুমেন্ট গ্রহণ করে এমন পদ্ধতিতে একটি ভেরিয়েবল পাস করবেন?
হেলোজোজিমি

23

ইতিমধ্যে অনেক উত্তর আছে এবং সেগুলি সব সঠিক। আপনি যদি ব্যবহার করতে চান তবে dispatch_afterআপনার স্নিপেটটি সন্ধান করা উচিত যা Code Snippet Libraryডান নীচের অংশে অন্তর্ভুক্ত রয়েছে (যেখানে আপনি UIউপাদানগুলি নির্বাচন করতে পারেন )।

এখানে চিত্র বর্ণনা লিখুন

সুতরাং আপনাকে কেবল কোডে প্রেরণ লিখে এই স্নিপেটটি কল করতে হবে :

এখানে চিত্র বর্ণনা লিখুন


16

0.1 সেকেন্ড বিলম্ব পদ্ধতির পরে নিম্নলিখিত কোডটি করার জন্য কল করার পরে আপনি সঞ্চালক নির্বাচকটি ব্যবহার করতে পারেন।

[self performSelector:@selector(InsertView)  withObject:nil afterDelay:0.1]; 

9

আপনি এটিও করতে পারেন:

[UIView animateWithDuration:1.0
                 animations:^{ self.view.alpha = 1.1; /* Some fake chages */ }
                 completion:^(BOOL finished)
{
    NSLog(@"A second lapsed.");
}];

এই ক্ষেত্রে আপনাকে অ্যানিমেশনটির কাজ পেতে কিছু দর্শনে কিছু পরিবর্তন নকল করতে হবে। এটি সত্যই হ্যাকি, তবে আমি ব্লক ভিত্তিক স্টাফ পছন্দ করি। অথবা নীচে নীচে @mcfedr উত্তর গুটিয়ে নিন।


waitFor(1.0, ^
{
    NSLog(@"A second lapsed");
});

typedef void (^WaitCompletionBlock)();
void waitFor(NSTimeInterval duration, WaitCompletionBlock completion)
{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC),
                   dispatch_get_main_queue(), ^
    { completion(); });
}

নিশ্চিত নয়, তবে আমি মনে করি যে আপনি যে প্রথম বিকল্পটি প্রস্তাব করবেন তার পার্শ্ব-প্রতিক্রিয়া থাকতে পারে যা ব্যবহারকারীদের সচেতন হওয়া উচিত, উদাহরণস্বরূপ, ইউআই এর অংশগুলিতে ব্যবহারকারীর ইন্টারঅ্যাকশন অবরুদ্ধ করে। আমার প্রবৃত্তিটি হ'ল এটি কিছু অপ্রয়োজনীয় সিপিইউ বা অন্যান্য সংস্থান ড্রেনের কারণ হতে পারে তবে আমি পরীক্ষা করে দেখিনি।
বজর্ন রোচে

8

তুমি এটি করতে পারো

[self performSelector:@selector(MethodToExecute) withObject:nil afterDelay:1.0 ];

4

সুইফট 2.x

let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC)))
 dispatch_after(delayTime, dispatch_get_main_queue()) {
 print("do some work")
}

সুইফট 3.x - এবং - সুইফট 4

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
    print("do some work")
}

বা পাস a escaping closure

func delay(seconds: Double, completion: @escaping()-> Void) {
    DispatchQueue.main.asyncAfter(deadline: .now() + seconds, execute: completion)
}

1

চেক করা সমাধান থেকে একটি সুইফট 3 সমাধান রয়েছে:

self.perform(#selector(self.targetMethod), with: self, afterDelay: 1.0)

এবং পদ্ধতি আছে

@objc fileprivate func targetMethod(){

}


-34

দ্রষ্টব্য: এটি আপনার সম্পূর্ণ থ্রেডকে বিরতি দেবে, কেবল একটি পদ্ধতি নয়।
আপনার পদ্ধতি কল করার ঠিক আগে 1000 এমএসের জন্য ঘুমাতে / অপেক্ষা / থামানোর জন্য কল করুন?

Sleep(1000); // does nothing the next 1000 mSek

Methodcall(params); // now do the real thing

সম্পাদনা করুন: উপরের উত্তরটি সাধারণ প্রশ্নের ক্ষেত্রে প্রযোজ্য "আমি কীভাবে 1 সেকেন্ডের জন্য কোনও পদ্ধতির কলকে বিলম্ব করতে পারি?", যা উত্তর দেওয়ার সময় জিজ্ঞাসা করা প্রশ্ন ছিল (প্রকৃত উত্তরটি মূল প্রশ্নের 7 মিনিটের মধ্যে দেওয়া হয়েছিল: - ))। সেই সময় ভাষা সম্পর্কে কোনও তথ্য দেওয়া হয়নি, তাই দয়া করে স্লিপ আই এক্সকোড ওগ ক্লাসের ঘাটতি ব্যবহারের সঠিক পদ্ধতি সম্পর্কে বিচক্ষণতা বন্ধ করুন ...


কেবলমাত্র বর্তমান থ্রেডে, অন্যান্য থ্রেড চলতে থাকবে।
মার্ক চর্বোনিউ

4
গীজ। আমি পেয়েছি কেন কয়েকবার এটিকে নিচে ভোট দেওয়া হয়েছিল, কিন্তু কে হেক -২ at-এ দেখেছিল এবং সিদ্ধান্ত নিয়েছে যে এটির আর দরকার আছে? -3 বা কিছু করে পয়েন্টটি পারা যায় না। "এটি আপনার পুরো থ্রেডকে থামিয়ে দেবে" বা এটিকে লোককে নিম্নমানের পরিবর্তে কিছু বলার জন্য উত্তরটি সম্পাদনা করবেন না কেন?
অ্যালবার্ট রেনশো

সুতরাং আপনি কি যদি পুরো থ্রেডটি থামাতে চান? যদি এটি কোনও শালীন সতর্কতা নিয়ে আসে তবে একটি বৈধ বিকল্পের মতো মনে হচ্ছে।
Departamento বি

@ অ্যালবার্ট রেনশা আমি আপনার সাথে পুরোপুরি একমত আমি এখানে এবং এর 35 টি ডাউন ডাউন এবং আমি তাকে আমার আপ দিয়েছি। আমি আরও কম খারাপ নামী ব্যবহারকারীদের দিকে আক্রমণ করার মতো দেখতে পাচ্ছি। কেউ কোনও সম্পাদনা বা কিছু নির্দিষ্ট করবে না। আমি আজ একটি উত্তর দেখেছি যে সত্যিই ডুবে গেছে। এই ব্যক্তিটি কেবলমাত্র সেই ভুলটিই হ'ল তিনি / তিনি উদ্দেশ্যমূলক ভাষার সাথে একটি দ্রুত প্রশ্নের উত্তর দিয়েছিলেন answered যদি এটি একটি বিশাল ভুল হয় তবে আমি উদ্দেশ্য সি এর অধীনে এতগুলি দ্রুত উত্তর দেখাতে চাই।
সৌরজ বাবু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.